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