{-# 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