wraxml-0.3: src/Text/XML/WraXML/Tree/LazyParser.hs
module Text.XML.WraXML.Tree.LazyParser where
import qualified Text.ParserCombinators.PolyLazy as Parser
import Text.ParserCombinators.PolyLazy (Parser, )
import Control.Monad (liftM2, )
force :: Parser t a -> Parser t a
force = Parser.apply (return id)
{-
Like Parser.manyFinally,
but a matching terminator parser has precedence
to a successful element parser.
-}
manyFinallyAppend :: Parser t [a] -> a ->
Parser t a -> Parser t [a]
manyFinallyAppend terminator eofWarn p =
let recourse = force $
terminator `Parser.onFail`
liftM2 (:) p recourse `Parser.onFail`
return [eofWarn]
in recourse
manyLazy :: Parser t a -> Parser t [a]
manyLazy p =
let recourse = force $ liftM2 (:) p recourse `Parser.onFail` return []
in recourse