--------------------------------------------------------------------------------
--                                                                            --
-- interpreter building block for nondeterministic computations               --
--                                                                            --
--------------------------------------------------------------------------------

-- L

data L x = Amb (List x)

instance Functor L where
  map g (Amb xs) = Amb (map g xs)
  
-- parse

instance Parser m x => Parser m (L x) where
  parser 
    = do { xs <- pList parser' ; result (Amb xs) }
     where
      parser' = parser :: Parser m x => m x

-- unparse

instance Algebra L (IO ()) where
  phi (Amb xs) = uList xs  

-- interpret 

instance ListMonad m => Algebra L (m v) where
  phi (Amb ms) = amb ms 

--------------------------------------------------------------------------------
