value-supply-0.5: 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.

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.

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.

split :: Supply a -> [Supply a]Source

Generate an infinite list of supplies.

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.