 | category-extras-0.53.6: Various modules and constructs inspired by category theory | Contents | Index |
|
Control.Comonad.Supply | Portability | portable | Stability | provisional | Maintainer | Edward Kmett <ekmett@gmail.com> |
|
|
|
|
|
Description |
The technique for generating new values is based on the paper
''On Generating Unique Names''
by Lennart Augustsson, Mikael Rittri, and Dan Synek.
Integrated from value-supply-0.1
TODO: a SupplyT Comonad Transformer
|
|
Synopsis |
|
|
|
Documentation |
|
module Control.Comonad |
|
Creating supplies
|
|
data Supply a |
A type that can be used to generate values on demand.
A supply may be turned into two different supplies by using
the functions supplyLeft and supplyRight.
| Instances | |
|
|
newSupply :: a -> (a -> a) -> IO (Supply a) |
Creates a new supply of values.
The arguments specify how to generate values:
the first argument is an initial value, the
second specifies how to generate a new value from an existing one.
|
|
newEnumSupply :: Enum a => IO (Supply a) |
A supply of values that are in the Enum class.
The initial value is toEnum 0, new values are generates with succ.
|
|
newNumSupply :: Num a => IO (Supply a) |
A supply of values that are in the Num class.
The initial value is 0, new values are generated by adding 1.
|
|
Obtaining values from supplies
|
|
supplyValue :: Supply a -> a |
Get the value of a supply. This function, together with
modifySupply forms a comonad on Supply.
|
|
Generating new supplies from old
|
|
supplyLeft :: Supply a -> Supply a |
Generate a new supply. This supply is different from the one
generated with supplyRight.
|
|
supplyRight :: Supply a -> Supply a |
Generate a new supply. This supply is different from the one
generated with supplyLeft.
|
|
modifySupply :: Supply a -> (Supply a -> b) -> Supply b |
Generate a new supply by systematically applying a function
to an existing supply. This function, together with supplyValue
form a comonad on Supply.
|
|
split :: Supply a -> [Supply a] |
Generate an infinite list of supplies by using supplyLeft and
supplyRight repeatedly.
|
|
split2 :: Supply a -> (Supply a, Supply a) |
Split a supply into two different supplies.
The resulting supplies are different from the input supply.
|
|
split3 :: Supply a -> (Supply a, Supply a, Supply a) |
Split a supply into three different supplies.
|
|
split4 :: Supply a -> (Supply a, Supply a, Supply a, Supply a) |
Split a supply into four different supplies.
|
|
Produced by Haddock version 2.1.0 |