-- ILists: lists whose cdr fields are IVars, filled in asynchronously -- via Par computation. -- This module mostly exists as a datatype to use in building other, -- higher-level abstractions. (See OpenList and Stream.) module Control.Monad.Par.IList ( IList(..) ) where import Control.Monad.Par import Control.DeepSeq -- | An 'IList' is the equivalent of a lazy list in the 'Par' monad. -- The tail of the list is an 'IVar', which allows the list to be -- produced and consumed in parallel. data IList a = Null | Cons { hd :: a, tl :: IVar (IList a) } -- | To fully evaluate an 'IList' means to evaluate both the head -- and tail. This does not evaluate the entire spine of the list -- of course, because the tail is an 'IVar'. instance NFData a => NFData (IList a) where -- rnf Null = r0 rnf Null = () rnf (Cons a b) = rnf a `seq` rnf b