{-# LANGUAGE FunctionalDependencies #-}

module Main where

-- | Something.
class (MonadReader r s, MonadWriter w m) => MonadState s m | m -> s where
    get :: m s
    put :: s -> m ()

-- | 'MonadParsec'
class
    ( Stream s -- Token streams
    , MonadPlus m -- Potential for failure
    ) =>
    MonadParsec e s m
        | m -> e s
    where
    -- | 'getState' returns state
    getState ::
        m s

    -- | 'putState' sets state
    putState ::
        s ->
        m ()
