lvish- Parallel scheduler, LVar data structures, and infrastructure to build more.

Safe HaskellUnsafe



This is not a datatype for the end-user.

Rather, this module is for building new LVar types in a comparatively easy way: by putting a pure value in a mutable container, and defining a put operation as a pure function.

The data structure implementor who uses this module must guarantee that their put operation computes a least upper bound, ensuring that the set of states that their LVar type can take on form a join-semilattice (



newtype PureLVar s t Source

An LVar which consists merely of an immutable, pure value inside a mutable box.


PureLVar (LVar s (IORef t) t) 


Eq (PureLVar s v)

Physical identity, just as with IORefs.

DeepFrz a => DeepFrz (PureLVar s a) 

newPureLVar :: BoundedJoinSemiLattice t => t -> Par d s (PureLVar s t)Source

A new pure LVar populated with the provided initial state.

putPureLVar :: JoinSemiLattice t => PureLVar s t -> t -> Par d s ()Source

Put a new value which will be joined with the old.

waitPureLVar :: (JoinSemiLattice t, Eq t) => PureLVar s t -> t -> Par d s ()Source

Wait until the pure LVar has crossed a threshold and then unblock. (In the semantics, this is a singleton query set.)

freezePureLVar :: PureLVar s t -> Par QuasiDet s tSource

Freeze the pure LVar, returning its exact value. Subsequent puts will raise an error.