Copyright | Copyright (C) 2005 Uwe Schmidt |
---|---|

License | MIT |

Maintainer | Uwe Schmidt (uwe\@fh-wedel.de) |

Stability | experimental |

Portability | multi parameter classes and functional depenedencies required |

Safe Haskell | Safe |

Language | Haskell98 |

Arrows for managing an explicit state

State arrows work similar to state monads. A state value is threaded through the application of arrows.

- class Arrow a => ArrowState s a | a -> s where

# Documentation

class Arrow a => ArrowState s a | a -> s where Source #

The interface for accessing and changing the state component.

Multi parameter classes and functional dependencies are required.

changeState :: (s -> b -> s) -> a b b Source #

change the state of a state arrow by applying a function for computing a new state from the old and the arrow input. Result is the arrow input

accessState :: (s -> b -> c) -> a b c Source #

access the state with a function using the arrow input as data for selecting state components.

read the complete state, ignore arrow input

definition: ` getState = accessState (\ s x -> s) `

overwrite the old state

definition: ` setState = changeState (\ s x -> x) `

nextState :: (s -> s) -> a b s Source #

change state (and ignore input) and return new state

convenience function, usefull for generating e.g. unique identifiers:

example with SLA state list arrows

newId :: SLA Int b String newId = nextState (+1) >>> arr (('#':) . show) runSLA 0 (newId <+> newId <+> newId) undefined = ["#1", "#2", "#3"]

ArrowState s (SLA s) Source # | |

ArrowState s (IOSLA s) Source # | |