Portability | portable |
---|---|
Stability | provisional |
Maintainer | Iavor S. Diatchki <iavor.diatchki@gmail.com> |
The technique for generating new values is based on the paper ''On Generating Unique Names'' by Lennart Augustsson, Mikael Rittri, and Dan Synek.
- data Supply a
- newSupply :: a -> (a -> a) -> IO (Supply a)
- newEnumSupply :: Enum a => IO (Supply a)
- newNumSupply :: Num a => IO (Supply a)
- newDupableSupply :: a -> (a -> a) -> IO (Supply a)
- newDupableEnumSupply :: Enum a => IO (Supply a)
- newDupableNumSupply :: Num a => IO (Supply a)
- supplyValue :: Supply a -> a
- modifySupply :: Supply a -> (Supply a -> b) -> Supply b
- split :: Supply a -> [Supply a]
- split2 :: Supply a -> (Supply a, Supply a)
- split3 :: Supply a -> (Supply a, Supply a, Supply a)
- split4 :: Supply a -> (Supply a, Supply a, Supply a, Supply a)
Creating supplies
newSupply :: a -> (a -> a) -> IO (Supply a)Source
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)Source
newNumSupply :: Num a => IO (Supply a)Source
A supply of values that are in the Num
class.
The initial value is 0, new values are generated by adding 1.
newDupableSupply :: a -> (a -> a) -> IO (Supply a)Source
Create a new supply of values.
WARNING: This version is faster then newSupply
but it is not completely
thread safe, so use only if performance is an issue!
Rules for using the generated supplies:
* Supply splitting should be evaluated in a single thread.
For example, use case with split2
to force the splitting
of a supply.
* Different threads should work with different supplies.
For example, one could (strictly) split a supply, and then
fork new threads with the resulting supplies.
newDupableEnumSupply :: Enum a => IO (Supply a)Source
A supply of values that are in the Enum
class.
The initial value is toEnum 0
, new values are generates with succ
.
WARNING: See comment on newDupableSupply
newDupableNumSupply :: Num a => IO (Supply a)Source
A supply of values that are in the Num
class.
The initial value is 0, new values are generated by adding 1.
WARNING: See comment on newDupableSupply
Obtaining values from supplies
supplyValue :: Supply a -> aSource
Get the value of a supply. This function, together with
modifySupply
forms a comonad on Supply
.
Generating new supplies from old
modifySupply :: Supply a -> (Supply a -> b) -> Supply bSource
Generate a new supply by systematically applying a function
to an existing supply. This function, together with supplyValue
form a comonad on Supply
.
split2 :: Supply a -> (Supply a, Supply a)Source
Split a supply into two different supplies. The resulting supplies are different from the input supply.