module Text.HTML.Tagchup.Parser.Core (
T,
nextChar, withDefault, withDefault',
run, gets, tell, censor, mfix,
allowFail, allowFail', allowEmit,
module Data.Functor.Identity,
) where
import qualified Text.HTML.Tagchup.Parser.Status as Status
import qualified Text.HTML.Tagchup.Parser.Stream as Stream
import Data.Tuple.HT (mapSnd, )
import qualified Control.Monad.Trans.State as State
import Control.Monad.Trans.Writer (WriterT(..), mapWriterT, tell, censor, )
import Control.Monad.Trans.State (StateT(..), mapStateT, )
import Control.Monad.Fix (mfix)
import Data.Functor.Identity (Identity(..), )
import Control.Monad.Trans.Class (lift, )
import Control.Monad (liftM, )
import Data.Monoid (Monoid, mempty, )
type T input output fail = WriterT output (StateT (Status.T input) fail)
run :: Monad fail =>
T input output fail a -> Status.T input -> fail (a, Status.T input, output)
run p =
liftM (\((a,w),st) -> (a,st,w)) . runStateT (runWriterT p)
nextChar :: (Monoid output, Stream.C input) =>
T input output Maybe Char
nextChar =
lift $ Stream.getChar
gets :: (Monoid output, Monad fail) =>
(Status.T input -> a) -> T input output fail a
gets = lift . State.gets
allowEmit ::
(Monad fail, Monoid output) =>
T input () fail a -> T input output fail a
allowEmit =
mapWriterT (liftM (mapSnd (const mempty)))
allowFail' ::
StateT s Identity a -> StateT s Maybe a
allowFail' =
mapStateT (Just . runIdentity)
allowFail :: T input output Identity a -> T input output Maybe a
allowFail =
mapWriterT allowFail'
withDefault' ::
StateT s Maybe a ->
StateT s Identity a ->
StateT s Identity a
withDefault' p q =
StateT $ \st ->
maybe (runStateT q st) Identity (runStateT p st)
withDefault ::
T input output Maybe a ->
T input output Identity a ->
T input output Identity a
withDefault p q =
WriterT $ withDefault' (runWriterT p) (runWriterT q)