-- | a monad that strictly evaluates intermediate return values.
module Strict (Strict(..)) where

import Control.Applicative
-- import Control.Monad

newtype Strict a = Strict { runStrict :: a }
instance Functor Strict where 
    fmap f (Strict a) = Strict (f a)
instance Applicative Strict where 
    pure = Strict
    (<*>) (Strict f) (Strict a) = Strict (f a)
instance Monad Strict where
    return = Strict
    (>>=) (Strict a) fn = fn a