{-# LANGUAGE DeriveFunctor #-}
module System.FilePattern.Monads(
Next, runNext, getNext
) where
import Control.Applicative
import Prelude
newtype Next e a = Next ([e] -> Maybe ([e], a))
deriving Functor
instance Applicative (Next e) where
pure a = Next $ \es -> Just (es, a)
Next f <*> Next x = Next $ \es -> do
(es, f) <- f es
(es, x) <- x es
Just (es, f x)
getNext :: Next e e
getNext = Next $ \x -> case x of
e:es -> Just (es, e)
_ -> Nothing
runNext :: [e] -> Next e a -> Maybe ([e], a)
runNext ps (Next f) = f ps