ruin-0.1.0.0: Data/Ruin/Eval.hs
module Data.Ruin.Eval (
Eval(..),
runEval,
) where
-- | An evaluation box. It is crucially not a newtype nor strict in
-- its contents.
--
-- This data type is a simplification of
-- 'Control.Parallel.Strategies.Eval'.
data Eval a = Done a
runEval :: Eval a -> a
{-# INLINE runEval #-}
runEval (Done a) = a
instance Functor Eval where
{-# INLINE fmap #-}
fmap f (Done a) = Done (f a)
instance Applicative Eval where
{-# INLINE pure #-}
pure = Done
{-# INLINE (<*>) #-}
Done f <*> Done a = Done (f a)
instance Monad Eval where
{-# INLINE return #-}
return = Done
{-# INLINE (>>=) #-}
Done a >>= k = k a