module EST where import GHC.Base newtype EST s a = EST (s -> Maybe (a, s)) unEST (EST m) = m instance Functor (EST s) where fmap f x = x >>= \ a -> return (f a) instance Applicative (EST s) where pure a = EST (\ s -> Just (a, s)) f <*> x = f >>= \ g -> x >>= \ a -> return (g a) instance Monad (EST s) where (EST m) >>= k = EST (\ s0 -> case m s0 of Just (a, s1) -> unEST (k a) s1 Nothing -> Nothing) instance Alternative (EST s) where empty = mzero (<|>) = mplus instance MonadPlus (EST s) where mzero = EST (\ _ -> Nothing) (EST m) `mplus` (EST n) = EST (\ s -> m s `mplus` n s) evalEST st s = case unEST st s of { Just (a, _) -> Just a; _ -> Nothing }