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

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