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)
- unsafeNewIntSupply :: IO (Supply Int)
- supplyValue :: Supply a -> a
- supplyLeft :: Supply a -> Supply a
- supplyRight :: Supply a -> Supply 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
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
.
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.
unsafeNewIntSupply :: IO (Supply Int)Source
Create a supply of ints. WARNING: In general, this is not thread safe! It should be OK, as long as the supply is not accessed by different threads. So, if you are in a multi-threaded setting, first split the supply, and give different supply values to the different threads.
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
supplyLeft :: Supply a -> Supply aSource
Generate a new supply. This supply is different from the one
generated with supplyRight
.
supplyRight :: Supply a -> Supply aSource
Generate a new supply. This supply is different from the one
generated with supplyLeft
.
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
.
split :: Supply a -> [Supply a]Source
Generate an infinite list of supplies by using supplyLeft
and
supplyRight
repeatedly.
split2 :: Supply a -> (Supply a, Supply a)Source
Split a supply into two different supplies. The resulting supplies are different from the input supply.