value-supply-0.4: A library for generating values without having to thread state.

Portabilityportable
Stabilityprovisional
MaintainerIavor S. Diatchki <iavor.diatchki@gmail.com>

Data.Supply

Contents

Description

The technique for generating new values is based on the paper ''On Generating Unique Names'' by Lennart Augustsson, Mikael Rittri, and Dan Synek.

Synopsis

Creating supplies

data Supply a Source

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)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

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)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.

split3 :: Supply a -> (Supply a, Supply a, Supply a)Source

Split a supply into three different supplies.

split4 :: Supply a -> (Supply a, Supply a, Supply a, Supply a)Source

Split a supply into four different supplies.