{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE UndecidableInstances #-}
module Xmlbf
(
parse
, parseM
, Parser
, ParserT
, parserT
, runParserT
, ParserState
, initialParserState
, pElement
, pAnyElement
, pName
, pAttr
, pAttrs
, pChildren
, pText
, pTextLazy
, pEndOfInput
, encode
, Node
, node
, pattern Element
, element
, element'
, pattern Text
, text
, text'
, pattern TextLazy
, textLazy
, textLazy'
, dfpos
, dfposM
, dfpre
, dfpreM
, FromXml(fromXml)
, ToXml(toXml)
)
where
import Control.Applicative (Alternative(empty, (<|>)), liftA2)
import Control.DeepSeq (NFData(rnf))
import Control.Monad (MonadPlus(mplus, mzero), join, when, ap)
import qualified Control.Monad.Catch as Ex
import Control.Monad.Error.Class (MonadError(catchError, throwError))
import qualified Control.Monad.Fail
import Control.Monad.Fix (MonadFix(mfix))
import Control.Monad.IO.Class (MonadIO(liftIO))
import Control.Monad.Morph (MFunctor(hoist))
import Control.Monad.Reader.Class (MonadReader(local, ask))
import Control.Monad.State.Class (MonadState(state))
import Control.Monad.Trans (MonadTrans(lift))
import Control.Monad.Zip (MonadZip(mzipWith))
import Control.Selective (Selective(select))
import qualified Data.ByteString.Builder as BB
import qualified Data.ByteString.Builder.Prim as BBP
import qualified Data.Char as Char
import Data.Foldable (for_, toList)
import Data.Functor.Identity (Identity(Identity), runIdentity)
import qualified Data.Map.Strict as Map
import qualified Data.HashMap.Strict as HM
import Data.Kind (Type)
import Data.Sequence (Seq)
import qualified Data.Sequence as Seq
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.Encoding as TL
import Data.Traversable (for)
import Data.Word (Word8)
data Node
= Node_Element !T.Text !(HM.HashMap T.Text T.Text) ![Node]
| Node_Text !TL.Text
deriving (Node -> Node -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Node -> Node -> Bool
$c/= :: Node -> Node -> Bool
== :: Node -> Node -> Bool
$c== :: Node -> Node -> Bool
Eq)
instance NFData Node where
rnf :: Node -> ()
rnf = \case
Node_Element Text
n HashMap Text Text
as [Node]
cs -> forall a. NFData a => a -> ()
rnf Text
n seq :: forall a b. a -> b -> b
`seq` forall a. NFData a => a -> ()
rnf HashMap Text Text
as seq :: forall a b. a -> b -> b
`seq` forall a. NFData a => a -> ()
rnf [Node]
cs seq :: forall a b. a -> b -> b
`seq` ()
Node_Text Text
t -> forall a. NFData a => a -> ()
rnf Text
t seq :: forall a b. a -> b -> b
`seq` ()
{-# INLINABLE rnf #-}
instance Show Node where
showsPrec :: Int -> Node -> ShowS
showsPrec Int
n = \Node
x -> Bool -> ShowS -> ShowS
showParen (Int
n forall a. Ord a => a -> a -> Bool
> Int
10) forall a b. (a -> b) -> a -> b
$ case Node
x of
Node_Text Text
t -> String -> ShowS
showString String
"Text " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => Int -> a -> ShowS
showsPrec Int
0 Text
t
Node_Element Text
t HashMap Text Text
as [Node]
cs ->
String -> ShowS
showString String
"Element " forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall a. Show a => Int -> a -> ShowS
showsPrec Int
0 Text
t forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> ShowS
showChar Char
' ' forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall a. Show a => Int -> a -> ShowS
showsPrec Int
0 (forall k v. HashMap k v -> [(k, v)]
HM.toList HashMap Text Text
as) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> ShowS
showChar Char
' ' forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall a. Show a => Int -> a -> ShowS
showsPrec Int
0 [Node]
cs
pattern Element
:: T.Text
-> HM.HashMap T.Text T.Text
-> [Node]
-> Node
pattern $mElement :: forall {r}.
Node
-> (Text -> HashMap Text Text -> [Node] -> r) -> ((# #) -> r) -> r
Element t as cs <- Node_Element t as cs
pattern TextLazy
:: TL.Text
-> Node
pattern $mTextLazy :: forall {r}. Node -> (Text -> r) -> ((# #) -> r) -> r
TextLazy tl <- Node_Text tl
pattern Text
:: T.Text
-> Node
pattern $mText :: forall {r}. Node -> (Text -> r) -> ((# #) -> r) -> r
Text t <- Node_Text (TL.toStrict -> t)
{-# COMPLETE Text, Element :: Node #-}
{-# COMPLETE TextLazy, Element :: Node #-}
{-# COMPLETE Node_Text, Element :: Node #-}
{-# COMPLETE Text, Node_Element :: Node #-}
{-# COMPLETE TextLazy, Node_Element :: Node #-}
node
:: (T.Text -> HM.HashMap T.Text T.Text -> [Node] -> a)
-> (TL.Text -> a)
-> Node
-> a
{-# INLINE node #-}
node :: forall a.
(Text -> HashMap Text Text -> [Node] -> a)
-> (Text -> a) -> Node -> a
node Text -> HashMap Text Text -> [Node] -> a
fe Text -> a
ft = \case
Node_Text Text
t -> Text -> a
ft Text
t
Node_Element Text
t HashMap Text Text
as [Node]
cs -> Text -> HashMap Text Text -> [Node] -> a
fe Text
t HashMap Text Text
as [Node]
cs
normalize :: [Node] -> [Node]
{-# INLINE normalize #-}
normalize :: [Node] -> [Node]
normalize = \case
Node_Text Text
"" : [Node]
ns -> [Node] -> [Node]
normalize [Node]
ns
Node_Text Text
a : Node_Text Text
b : [Node]
ns -> [Node] -> [Node]
normalize (Text -> [Node]
textLazy (Text
a forall a. Semigroup a => a -> a -> a
<> Text
b) forall a. Semigroup a => a -> a -> a
<> [Node]
ns)
Node_Text Text
a : [Node]
ns -> Text -> Node
Node_Text Text
a forall a. a -> [a] -> [a]
: [Node] -> [Node]
normalize [Node]
ns
Node_Element Text
t HashMap Text Text
as [Node]
cs : [Node]
ns -> Text -> HashMap Text Text -> [Node] -> Node
Node_Element Text
t HashMap Text Text
as ([Node] -> [Node]
normalize [Node]
cs) forall a. a -> [a] -> [a]
: [Node] -> [Node]
normalize [Node]
ns
[] -> []
text
:: T.Text
-> [Node]
{-# INLINE text #-}
text :: Text -> [Node]
text = Text -> [Node]
textLazy forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text
TL.fromStrict
text'
:: T.Text
-> Either String Node
{-# INLINE text' #-}
text' :: Text -> Either String Node
text' = Text -> Either String Node
textLazy' forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text
TL.fromStrict
textLazy
:: TL.Text
-> [Node]
{-# INLINE textLazy #-}
textLazy :: Text -> [Node]
textLazy = forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (\String
_ -> []) (\Node
x -> [Node
x]) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Either String Node
textLazy'
textLazy'
:: TL.Text
-> Either String Node
{-# INLINE textLazy' #-}
textLazy' :: Text -> Either String Node
textLazy' = \case
Text
"" -> forall a b. a -> Either a b
Left String
"Empty text"
Text
t -> forall a b. b -> Either a b
Right (Text -> Node
Node_Text Text
t)
element
:: T.Text
-> HM.HashMap T.Text T.Text
-> [Node]
-> [Node]
{-# INLINE element #-}
element :: Text -> HashMap Text Text -> [Node] -> [Node]
element Text
t HashMap Text Text
hm [Node]
ns = case Text -> HashMap Text Text -> [Node] -> Either String Node
element' Text
t HashMap Text Text
hm [Node]
ns of
Right Node
x -> [Node
x]
Left String
_ -> []
element'
:: T.Text
-> HM.HashMap T.Text T.Text
-> [Node]
-> Either String Node
element' :: Text -> HashMap Text Text -> [Node] -> Either String Node
element' Text
t0 HashMap Text Text
hm0 [Node]
ns0 = do
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Text
t0 forall a. Eq a => a -> a -> Bool
/= Text -> Text
T.strip Text
t0)
(forall a b. a -> Either a b
Left (String
"Element name has surrounding whitespace: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Text
t0))
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Text -> Bool
T.null Text
t0) (forall a b. a -> Either a b
Left String
"Element name is blank")
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ (forall k v. HashMap k v -> [k]
HM.keys HashMap Text Text
hm0) forall a b. (a -> b) -> a -> b
$ \Text
k -> do
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Text
k forall a. Eq a => a -> a -> Bool
/= Text -> Text
T.strip Text
k)
(forall a b. a -> Either a b
Left (String
"Attribute name has surrounding whitespace: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Text
k))
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Text -> Bool
T.null Text
k) (forall a b. a -> Either a b
Left String
"Attribute name is blank")
forall a b. b -> Either a b
Right (Text -> HashMap Text Text -> [Node] -> Node
Node_Element Text
t0 HashMap Text Text
hm0 ([Node] -> [Node]
normalize [Node]
ns0))
class FromXml a where
fromXml :: Monad m => ParserT m a
data ParserState
= STop ![Node]
| SReg !T.Text !(HM.HashMap T.Text T.Text) ![Node]
deriving (ParserState -> ParserState -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ParserState -> ParserState -> Bool
$c/= :: ParserState -> ParserState -> Bool
== :: ParserState -> ParserState -> Bool
$c== :: ParserState -> ParserState -> Bool
Eq)
initialParserState :: [Node] -> ParserState
initialParserState :: [Node] -> ParserState
initialParserState = [Node] -> ParserState
STop forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Node] -> [Node]
normalize
{-# INLINE initialParserState #-}
newtype ParserT (m :: Type -> Type) (a :: Type)
= ParserT (ParserState -> m (ParserState, Either String a))
type Parser = ParserT Identity :: Type -> Type
parserT
:: (ParserState -> m (ParserState, Either String a))
-> ParserT m a
parserT :: forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
parserT = forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT
{-# INLINE parserT #-}
runParserT
:: ParserT m a
-> ParserState
-> m (ParserState, Either String a)
runParserT :: forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT (ParserT ParserState -> m (ParserState, Either String a)
f) = ParserState -> m (ParserState, Either String a)
f
{-# INLINE runParserT #-}
parseM
:: Applicative m
=> ParserT m a
-> [Node]
-> m (Either String a)
parseM :: forall (m :: * -> *) a.
Applicative m =>
ParserT m a -> [Node] -> m (Either String a)
parseM ParserT m a
p = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ParserT m a
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Node] -> ParserState
initialParserState
{-# INLINE parseM #-}
parse
:: Parser a
-> [Node]
-> Either String a
parse :: forall a. Parser a -> [Node] -> Either String a
parse Parser a
p = forall a. Identity a -> a
runIdentity forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a.
Applicative m =>
ParserT m a -> [Node] -> m (Either String a)
parseM Parser a
p
{-# INLINE parse #-}
#if MIN_VERSION_base(4,9,0)
instance (Monad m, Semigroup a) => Semigroup (ParserT m a) where
<> :: ParserT m a -> ParserT m a -> ParserT m a
(<>) = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a. Semigroup a => a -> a -> a
(<>)
{-# INLINE (<>) #-}
#endif
instance (Monad m, Monoid a) => Monoid (ParserT m a) where
mempty :: ParserT m a
mempty = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Monoid a => a
mempty
{-# INLINE mempty #-}
#if MIN_VERSION_base(4,9,0)
mappend :: ParserT m a -> ParserT m a -> ParserT m a
mappend = forall a. Semigroup a => a -> a -> a
(<>)
#else
mappend = liftA2 mappend
#endif
{-# INLINE mappend #-}
instance Functor m => Functor (ParserT m) where
fmap :: forall a b. (a -> b) -> ParserT m a -> ParserT m b
fmap a -> b
f = \ParserT m a
pa -> forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\ParserState
s -> forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f)) (forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ParserT m a
pa ParserState
s))
{-# INLINE fmap #-}
instance Monad m => Applicative (ParserT m) where
pure :: forall a. a -> ParserT m a
pure = \a
a -> forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\ParserState
s -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s, forall a b. b -> Either a b
Right a
a))
{-# INLINE pure #-}
<*> :: forall a b. ParserT m (a -> b) -> ParserT m a -> ParserT m b
(<*>) = forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b
ap
{-# INLINE (<*>) #-}
instance Monad m => Alternative (ParserT m) where
empty :: forall a. ParserT m a
empty = forall (m :: * -> *) a. Applicative m => String -> ParserT m a
pFail String
"empty"
{-# INLINE empty #-}
ParserT m a
pa <|> :: forall a. ParserT m a -> ParserT m a -> ParserT m a
<|> ParserT m a
pb = forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\ParserState
s0 -> do
(ParserState
s1, Either String a
ea) <- forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ParserT m a
pa ParserState
s0
case Either String a
ea of
Right a
a -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s1, forall a b. b -> Either a b
Right a
a)
Left String
_ -> forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ParserT m a
pb ParserState
s0)
{-# INLINABLE (<|>) #-}
instance Monad m => Selective (ParserT m) where
select :: forall a b.
ParserT m (Either a b) -> ParserT m (a -> b) -> ParserT m b
select ParserT m (Either a b)
pe ParserT m (a -> b)
pf = forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\ParserState
s0 -> do
(ParserState
s1, Either String (Either a b)
eeab) <- forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ParserT m (Either a b)
pe ParserState
s0
case Either String (Either a b)
eeab of
Right (Right b
b) -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s1, forall a b. b -> Either a b
Right b
b)
Right (Left a
a) -> forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT (ParserT m (a -> b)
pf forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Applicative f => a -> f a
pure a
a) ParserState
s1
Left String
msg -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s1, forall a b. a -> Either a b
Left String
msg))
{-# INLINABLE select #-}
instance Monad m => Monad (ParserT m) where
return :: forall a. a -> ParserT m a
return = forall (f :: * -> *) a. Applicative f => a -> f a
pure
{-# INLINE return #-}
ParserT m a
pa >>= :: forall a b. ParserT m a -> (a -> ParserT m b) -> ParserT m b
>>= a -> ParserT m b
kpb = forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\ParserState
s0 -> do
(ParserState
s1, Either String a
ea) <- forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ParserT m a
pa ParserState
s0
case Either String a
ea of
Right a
a -> forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT (a -> ParserT m b
kpb a
a) ParserState
s1
Left String
msg -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s1, forall a b. a -> Either a b
Left String
msg))
{-# INLINABLE (>>=) #-}
#if !MIN_VERSION_base(4,9,0)
fail = pFail
{-# INLINE fail #-}
#endif
#if MIN_VERSION_base(4,9,0)
instance Monad m => Control.Monad.Fail.MonadFail (ParserT m) where
fail :: forall a. String -> ParserT m a
fail = forall (m :: * -> *) a. Applicative m => String -> ParserT m a
pFail
{-# INLINE fail #-}
#endif
pFail :: Applicative m => String -> ParserT m a
pFail :: forall (m :: * -> *) a. Applicative m => String -> ParserT m a
pFail = \String
msg -> forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\ParserState
s -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s, forall a b. a -> Either a b
Left String
msg))
{-# INLINE pFail #-}
instance Monad m => MonadPlus (ParserT m) where
mzero :: forall a. ParserT m a
mzero = forall (f :: * -> *) a. Alternative f => f a
empty
{-# INLINE mzero #-}
mplus :: forall a. ParserT m a -> ParserT m a -> ParserT m a
mplus = forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
(<|>)
{-# INLINE mplus #-}
instance MonadFix m => MonadFix (ParserT m) where
mfix :: forall a. (a -> ParserT m a) -> ParserT m a
mfix a -> ParserT m a
f =
let die :: String -> a
die = \String
msg -> forall a. HasCallStack => String -> a
error (String
"mfix (ParserT): " forall a. Semigroup a => a -> a -> a
<> String
msg)
in forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\ParserState
s0 ->
forall (m :: * -> *) a. MonadFix m => (a -> m a) -> m a
mfix (\ ~(ParserState
_s1, Either String a
ea) -> forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT (a -> ParserT m a
f (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall {a}. String -> a
die forall a. a -> a
id Either String a
ea)) ParserState
s0))
instance MonadZip m => MonadZip (ParserT m) where
mzipWith :: forall a b c.
(a -> b -> c) -> ParserT m a -> ParserT m b -> ParserT m c
mzipWith a -> b -> c
f ParserT m a
pa ParserT m b
pb = forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\ParserState
s0 -> do
(ParserState
s1, Either String a
ea) <- forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ParserT m a
pa ParserState
s0
case Either String a
ea of
Right a
a0 ->
forall (m :: * -> *) a b c.
MonadZip m =>
(a -> b -> c) -> m a -> m b -> m c
mzipWith (\a
a1 (ParserState
s2, Either String b
eb) -> (ParserState
s2, forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> b -> c
f a
a1) Either String b
eb))
(forall (f :: * -> *) a. Applicative f => a -> f a
pure a
a0) (forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ParserT m b
pb ParserState
s1)
Left String
msg -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s1, forall a b. a -> Either a b
Left String
msg))
{-# INLINABLE mzipWith #-}
instance MonadTrans ParserT where
lift :: forall (m :: * -> *) a. Monad m => m a -> ParserT m a
lift = \m a
ma -> forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\ParserState
s -> m a
ma forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \a
a -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s, forall a b. b -> Either a b
Right a
a))
{-# INLINE lift #-}
instance MFunctor ParserT where
hoist :: forall (m :: * -> *) (n :: * -> *) b.
Monad m =>
(forall a. m a -> n a) -> ParserT m b -> ParserT n b
hoist forall a. m a -> n a
nat = \ParserT m b
p -> forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\ParserState
s -> forall a. m a -> n a
nat (forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ParserT m b
p ParserState
s))
{-# INLINE hoist #-}
instance MonadIO m => MonadIO (ParserT m) where
liftIO :: forall a. IO a -> ParserT m a
liftIO = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO
{-# INLINE liftIO #-}
instance MonadReader r m => MonadReader r (ParserT m) where
ask :: ParserT m r
ask = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall r (m :: * -> *). MonadReader r m => m r
ask
{-# INLINE ask #-}
local :: forall a. (r -> r) -> ParserT m a -> ParserT m a
local r -> r
f = \ParserT m a
p -> forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\ParserState
s -> forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local r -> r
f (forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ParserT m a
p ParserState
s))
{-# INLINE local #-}
instance MonadState s m => MonadState s (ParserT m) where
state :: forall a. (s -> (a, s)) -> ParserT m a
state = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s (m :: * -> *) a. MonadState s m => (s -> (a, s)) -> m a
state
{-# INLINE state #-}
instance MonadError e m => MonadError e (ParserT m) where
throwError :: forall a. e -> ParserT m a
throwError = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError
{-# INLINABLE throwError #-}
catchError :: forall a. ParserT m a -> (e -> ParserT m a) -> ParserT m a
catchError ParserT m a
ma e -> ParserT m a
h = forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\ParserState
s ->
forall e (m :: * -> *) a.
MonadError e m =>
m a -> (e -> m a) -> m a
catchError (forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ParserT m a
ma ParserState
s)
(\e
e -> forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT (e -> ParserT m a
h e
e) ParserState
s))
{-# INLINABLE catchError #-}
instance Ex.MonadThrow m => Ex.MonadThrow (ParserT m) where
throwM :: forall e a. Exception e => e -> ParserT m a
throwM = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
Ex.throwM
{-# INLINABLE throwM #-}
instance Ex.MonadCatch m => Ex.MonadCatch (ParserT m) where
catch :: forall e a.
Exception e =>
ParserT m a -> (e -> ParserT m a) -> ParserT m a
catch ParserT m a
ma e -> ParserT m a
h = forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\ParserState
s ->
forall (m :: * -> *) e a.
(MonadCatch m, Exception e) =>
m a -> (e -> m a) -> m a
Ex.catch (forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ParserT m a
ma ParserState
s)
(\e
e -> forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT (e -> ParserT m a
h e
e) ParserState
s))
{-# INLINABLE catch #-}
instance Ex.MonadMask m => Ex.MonadMask (ParserT m) where
mask :: forall b.
((forall a. ParserT m a -> ParserT m a) -> ParserT m b)
-> ParserT m b
mask (forall a. ParserT m a -> ParserT m a) -> ParserT m b
f = forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\ParserState
s ->
forall (m :: * -> *) b.
MonadMask m =>
((forall a. m a -> m a) -> m b) -> m b
Ex.mask (\forall a. m a -> m a
u ->
forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ((forall a. ParserT m a -> ParserT m a) -> ParserT m b
f (\ParserT m a
p -> forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (forall a. m a -> m a
u forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ParserT m a
p))) ParserState
s))
{-# INLINABLE mask #-}
uninterruptibleMask :: forall b.
((forall a. ParserT m a -> ParserT m a) -> ParserT m b)
-> ParserT m b
uninterruptibleMask (forall a. ParserT m a -> ParserT m a) -> ParserT m b
f = forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\ParserState
s ->
forall (m :: * -> *) b.
MonadMask m =>
((forall a. m a -> m a) -> m b) -> m b
Ex.uninterruptibleMask (\forall a. m a -> m a
u ->
forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ((forall a. ParserT m a -> ParserT m a) -> ParserT m b
f (\ParserT m a
p -> forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (forall a. m a -> m a
u forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ParserT m a
p))) ParserState
s))
{-# INLINABLE uninterruptibleMask #-}
generalBracket :: forall a b c.
ParserT m a
-> (a -> ExitCase b -> ParserT m c)
-> (a -> ParserT m b)
-> ParserT m (b, c)
generalBracket ParserT m a
acq a -> ExitCase b -> ParserT m c
rel a -> ParserT m b
use = forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\ParserState
s0 -> do
((ParserState
_sb,Either String b
eb), (ParserState
sc,Either String c
ec)) <- forall (m :: * -> *) a b c.
MonadMask m =>
m a -> (a -> ExitCase b -> m c) -> (a -> m b) -> m (b, c)
Ex.generalBracket
(forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ParserT m a
acq ParserState
s0)
(\(ParserState
s1, Either String a
ea) ExitCase (ParserState, Either String b)
ec -> case Either String a
ea of
Right a
a -> case ExitCase (ParserState, Either String b)
ec of
Ex.ExitCaseSuccess (ParserState
s2, Right b
b) ->
forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT (a -> ExitCase b -> ParserT m c
rel a
a (forall a. a -> ExitCase a
Ex.ExitCaseSuccess b
b)) ParserState
s2
Ex.ExitCaseSuccess (ParserState
s2, Left String
msg) ->
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s2, forall a b. a -> Either a b
Left String
msg)
Ex.ExitCaseException SomeException
e ->
forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT (a -> ExitCase b -> ParserT m c
rel a
a (forall a. SomeException -> ExitCase a
Ex.ExitCaseException SomeException
e)) ParserState
s1
ExitCase (ParserState, Either String b)
Ex.ExitCaseAbort ->
forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT (a -> ExitCase b -> ParserT m c
rel a
a forall a. ExitCase a
Ex.ExitCaseAbort) ParserState
s1
Left String
msg ->
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s1, forall a b. a -> Either a b
Left String
msg))
(\(ParserState
s1, Either String a
ea) -> case Either String a
ea of
Right a
a -> forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT (a -> ParserT m b
use a
a) ParserState
s1
Left String
msg ->
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s1, forall a b. a -> Either a b
Left String
msg))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
sc, forall a b c. (a -> b -> c) -> b -> a -> c
flip (,) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Either String c
ec forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Either String b
eb))
pElement
:: Monad m
=> T.Text
-> ParserT m a
-> ParserT m a
pElement :: forall (m :: * -> *) a.
Monad m =>
Text -> ParserT m a -> ParserT m a
pElement Text
t0 ParserT m a
p0 = forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT forall a b. (a -> b) -> a -> b
$ \case
SReg Text
t1 HashMap Text Text
as0 (Node_Element Text
t HashMap Text Text
as [Node]
cs : [Node]
cs0) | Text
t forall a. Eq a => a -> a -> Bool
== Text
t0 ->
forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ParserT m a
p0 (Text -> HashMap Text Text -> [Node] -> ParserState
SReg Text
t HashMap Text Text
as [Node]
cs) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
(ParserState
_, Right a
a) -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> HashMap Text Text -> [Node] -> ParserState
SReg Text
t1 HashMap Text Text
as0 [Node]
cs0, forall a b. b -> Either a b
Right a
a)
(ParserState
s1, Left String
msg) -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s1, forall a b. a -> Either a b
Left String
msg)
STop (Node_Element Text
t HashMap Text Text
as [Node]
cs : [Node]
cs0) | Text
t forall a. Eq a => a -> a -> Bool
== Text
t0 ->
forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ParserT m a
p0 (Text -> HashMap Text Text -> [Node] -> ParserState
SReg Text
t HashMap Text Text
as [Node]
cs) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
(ParserState
_, Right a
a) -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Node] -> ParserState
STop [Node]
cs0, forall a b. b -> Either a b
Right a
a)
(ParserState
s1, Left String
msg) -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s1, forall a b. a -> Either a b
Left String
msg)
SReg Text
t HashMap Text Text
as (Node_Text Text
x : [Node]
cs) | (Char -> Bool) -> Text -> Bool
TL.all Char -> Bool
Char.isSpace Text
x ->
forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT (forall (m :: * -> *) a.
Monad m =>
Text -> ParserT m a -> ParserT m a
pElement Text
t0 ParserT m a
p0) (Text -> HashMap Text Text -> [Node] -> ParserState
SReg Text
t HashMap Text Text
as [Node]
cs)
STop (Node_Text Text
x : [Node]
cs) | (Char -> Bool) -> Text -> Bool
TL.all Char -> Bool
Char.isSpace Text
x ->
forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT (forall (m :: * -> *) a.
Monad m =>
Text -> ParserT m a -> ParserT m a
pElement Text
t0 ParserT m a
p0) ([Node] -> ParserState
STop [Node]
cs)
ParserState
s0 -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s0, forall a b. a -> Either a b
Left (String
"Missing element " forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Text
t0))
{-# INLINABLE pElement #-}
pAnyElement
:: Monad m
=> ParserT m a
-> ParserT m a
pAnyElement :: forall (m :: * -> *) a. Monad m => ParserT m a -> ParserT m a
pAnyElement ParserT m a
p0 = forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT forall a b. (a -> b) -> a -> b
$ \case
SReg Text
t0 HashMap Text Text
as0 (Node_Element Text
t HashMap Text Text
as [Node]
cs : [Node]
cs0) ->
forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ParserT m a
p0 (Text -> HashMap Text Text -> [Node] -> ParserState
SReg Text
t HashMap Text Text
as [Node]
cs) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
(ParserState
_, Right a
a) -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> HashMap Text Text -> [Node] -> ParserState
SReg Text
t0 HashMap Text Text
as0 [Node]
cs0, forall a b. b -> Either a b
Right a
a)
(ParserState
s1, Left String
msg) -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s1, forall a b. a -> Either a b
Left String
msg)
STop (Node_Element Text
t HashMap Text Text
as [Node]
cs : [Node]
cs0) ->
forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT ParserT m a
p0 (Text -> HashMap Text Text -> [Node] -> ParserState
SReg Text
t HashMap Text Text
as [Node]
cs) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
(ParserState
_, Right a
a) -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Node] -> ParserState
STop [Node]
cs0, forall a b. b -> Either a b
Right a
a)
(ParserState
s1, Left String
msg) -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s1, forall a b. a -> Either a b
Left String
msg)
SReg Text
t HashMap Text Text
as (Node_Text Text
x : [Node]
cs) | (Char -> Bool) -> Text -> Bool
TL.all Char -> Bool
Char.isSpace Text
x ->
forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT (forall (m :: * -> *) a. Monad m => ParserT m a -> ParserT m a
pAnyElement ParserT m a
p0) (Text -> HashMap Text Text -> [Node] -> ParserState
SReg Text
t HashMap Text Text
as [Node]
cs)
STop (Node_Text Text
x : [Node]
cs) | (Char -> Bool) -> Text -> Bool
TL.all Char -> Bool
Char.isSpace Text
x ->
forall (m :: * -> *) a.
ParserT m a -> ParserState -> m (ParserState, Either String a)
runParserT (forall (m :: * -> *) a. Monad m => ParserT m a -> ParserT m a
pAnyElement ParserT m a
p0) ([Node] -> ParserState
STop [Node]
cs)
ParserState
s0 -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s0, forall a b. a -> Either a b
Left String
"Missing element")
{-# INLINABLE pAnyElement #-}
pName
:: Applicative m
=> ParserT m T.Text
pName :: forall (m :: * -> *). Applicative m => ParserT m Text
pName = forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\ParserState
s -> case ParserState
s of
SReg Text
t HashMap Text Text
_ [Node]
_ -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s, forall a b. b -> Either a b
Right Text
t)
ParserState
_ -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s, forall a b. a -> Either a b
Left String
"Before selecting an name, you must select an element"))
{-# INLINABLE pName #-}
pAttr
:: Applicative m
=> T.Text
-> ParserT m T.Text
pAttr :: forall (m :: * -> *). Applicative m => Text -> ParserT m Text
pAttr Text
n = forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\ParserState
s -> case ParserState
s of
SReg Text
t HashMap Text Text
as [Node]
cs -> case forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
HM.lookup Text
n HashMap Text Text
as of
Just Text
x -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> HashMap Text Text -> [Node] -> ParserState
SReg Text
t (forall k v. (Eq k, Hashable k) => k -> HashMap k v -> HashMap k v
HM.delete Text
n HashMap Text Text
as) [Node]
cs, forall a b. b -> Either a b
Right Text
x)
Maybe Text
Nothing -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s, forall a b. a -> Either a b
Left (String
"Missing attribute " forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Text
n))
ParserState
_ -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s, forall a b. a -> Either a b
Left String
"Before selecting an attribute, you must select an element"))
{-# INLINABLE pAttr #-}
pAttrs
:: Applicative m
=> ParserT m (HM.HashMap T.Text T.Text)
pAttrs :: forall (m :: * -> *).
Applicative m =>
ParserT m (HashMap Text Text)
pAttrs = forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\ParserState
s -> case ParserState
s of
SReg Text
t HashMap Text Text
as [Node]
cs -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> HashMap Text Text -> [Node] -> ParserState
SReg Text
t forall a. Monoid a => a
mempty [Node]
cs, forall a b. b -> Either a b
Right HashMap Text Text
as)
ParserState
_ -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s, forall a b. a -> Either a b
Left String
"Before selecting an attribute, you must select an element"))
{-# INLINABLE pAttrs #-}
pChildren
:: Applicative m
=> ParserT m [Node]
pChildren :: forall (m :: * -> *). Applicative m => ParserT m [Node]
pChildren = forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\case
STop [Node]
cs -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Node] -> ParserState
STop forall a. Monoid a => a
mempty, forall a b. b -> Either a b
Right [Node]
cs)
SReg Text
t HashMap Text Text
as [Node]
cs -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> HashMap Text Text -> [Node] -> ParserState
SReg Text
t HashMap Text Text
as forall a. Monoid a => a
mempty, forall a b. b -> Either a b
Right [Node]
cs))
{-# INLINABLE pChildren #-}
pText
:: Applicative m
=> ParserT m T.Text
pText :: forall (m :: * -> *). Applicative m => ParserT m Text
pText = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Text -> Text
TL.toStrict forall (m :: * -> *). Applicative m => ParserT m Text
pTextLazy
pTextLazy
:: Applicative m
=> ParserT m TL.Text
pTextLazy :: forall (m :: * -> *). Applicative m => ParserT m Text
pTextLazy = forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\case
STop (Node_Text Text
x : [Node]
ns) -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Node] -> ParserState
STop [Node]
ns, forall a b. b -> Either a b
Right Text
x)
SReg Text
t HashMap Text Text
as (Node_Text Text
x : [Node]
cs) -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> HashMap Text Text -> [Node] -> ParserState
SReg Text
t HashMap Text Text
as [Node]
cs, forall a b. b -> Either a b
Right Text
x)
ParserState
s0 -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s0, forall a b. a -> Either a b
Left String
"Missing text node"))
{-# INLINABLE pText #-}
pEndOfInput :: Applicative m => ParserT m ()
pEndOfInput :: forall (m :: * -> *). Applicative m => ParserT m ()
pEndOfInput = forall (m :: * -> *) a.
(ParserState -> m (ParserState, Either String a)) -> ParserT m a
ParserT (\ParserState
s -> case ParserState -> Bool
isEof ParserState
s of
Bool
True -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s, forall a b. b -> Either a b
Right ())
Bool
False -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserState
s, forall a b. a -> Either a b
Left String
"Not end of input yet"))
{-# INLINABLE pEndOfInput #-}
isEof :: ParserState -> Bool
isEof :: ParserState -> Bool
isEof = \case
SReg Text
_ HashMap Text Text
as [Node]
cs -> forall k v. HashMap k v -> Bool
HM.null HashMap Text Text
as Bool -> Bool -> Bool
&& forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Node]
cs
STop [Node]
ns -> forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Node]
ns
{-# INLINE isEof #-}
class ToXml a where
toXml :: a -> [Node]
encode :: [Node] -> BB.Builder
encode :: [Node] -> Builder
encode [Node]
xs = forall a. Monoid a => [a] -> a
mconcat (forall a b. (a -> b) -> [a] -> [b]
map Node -> Builder
encodeNode [Node]
xs)
where
encodeNode :: Node -> BB.Builder
encodeNode :: Node -> Builder
encodeNode = \case
Node_Text Text
x -> Text -> Builder
encodeXmlUtf8Lazy Text
x
Node_Element Text
t HashMap Text Text
as [Node]
cs ->
Builder
"<" forall a. Semigroup a => a -> a -> a
<> Text -> Builder
encodeUtf8 Text
t
forall a. Semigroup a => a -> a -> a
<> Builder -> HashMap Text Text -> Builder
encodeAttrs (Builder
">" forall a. Semigroup a => a -> a -> a
<> [Node] -> Builder
encode [Node]
cs forall a. Semigroup a => a -> a -> a
<> Builder
"</" forall a. Semigroup a => a -> a -> a
<> Text -> Builder
encodeUtf8 Text
t forall a. Semigroup a => a -> a -> a
<> Builder
">") HashMap Text Text
as
{-# INLINE encodeNode #-}
encodeAttrs :: BB.Builder -> HM.HashMap T.Text T.Text -> BB.Builder
encodeAttrs :: Builder -> HashMap Text Text -> Builder
encodeAttrs Builder
b HashMap Text Text
as = forall k a b. (k -> a -> b -> b) -> b -> Map k a -> b
Map.foldrWithKey'
(\Text
k Text
v Builder
o -> Builder
" " forall a. Semigroup a => a -> a -> a
<> Text -> Builder
encodeUtf8 Text
k forall a. Semigroup a => a -> a -> a
<> Builder
"=\"" forall a. Semigroup a => a -> a -> a
<> Text -> Builder
encodeXmlUtf8 Text
v forall a. Semigroup a => a -> a -> a
<> Builder
"\"" forall a. Semigroup a => a -> a -> a
<> Builder
o)
Builder
b (forall k v. Ord k => HashMap k v -> Map k v
mapFromHashMap HashMap Text Text
as)
{-# INLINE encodeAttrs #-}
dfpos :: ((Node -> [Node]) -> Node -> [Node]) -> Node -> [Node]
dfpos :: ((Node -> [Node]) -> Node -> [Node]) -> Node -> [Node]
dfpos (Node -> [Node]) -> Node -> [Node]
f = forall a. Identity a -> a
runIdentity forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *).
Monad m =>
((Node -> m [Node]) -> Node -> m [Node]) -> Node -> m [Node]
dfposM (\Node -> Identity [Node]
k -> forall a. a -> Identity a
Identity forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Node -> [Node]) -> Node -> [Node]
f (forall a. Identity a -> a
runIdentity forall b c a. (b -> c) -> (a -> b) -> a -> c
. Node -> Identity [Node]
k))
dfposM :: Monad m => ((Node -> m [Node]) -> Node -> m [Node]) -> Node -> m [Node]
dfposM :: forall (m :: * -> *).
Monad m =>
((Node -> m [Node]) -> Node -> m [Node]) -> Node -> m [Node]
dfposM (Node -> m [Node]) -> Node -> m [Node]
f = \Node
n0 -> do
Cursor
c1 <- forall (m :: * -> *).
Monad m =>
(Node -> m [Node]) -> Cursor -> m Cursor
traverseChildren (forall (m :: * -> *).
Monad m =>
((Node -> m [Node]) -> Node -> m [Node]) -> Node -> m [Node]
dfposM (Node -> m [Node]) -> Node -> m [Node]
f) (Node -> Cursor
cursorFromNode Node
n0)
Cursor
c2 <- forall (m :: * -> *).
Monad m =>
(Node -> m [Node]) -> Cursor -> m Cursor
traverseRightSiblings (forall (m :: * -> *).
Monad m =>
((Node -> m [Node]) -> Node -> m [Node]) -> Node -> m [Node]
dfposM (Node -> m [Node]) -> Node -> m [Node]
f) Cursor
c1
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([Node] -> [Node]
normalize forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. Monad m => m (m a) -> m a
join)
(forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse ((Node -> m [Node]) -> Node -> m [Node]
f (forall (m :: * -> *).
Monad m =>
((Node -> m [Node]) -> Node -> m [Node]) -> Node -> m [Node]
dfposM (Node -> m [Node]) -> Node -> m [Node]
f)) (Cursor -> [Node]
cursorSiblings Cursor
c2))
dfpre :: ((Node -> [Node]) -> Node -> [Node]) -> Node -> [Node]
dfpre :: ((Node -> [Node]) -> Node -> [Node]) -> Node -> [Node]
dfpre (Node -> [Node]) -> Node -> [Node]
f = forall a. Identity a -> a
runIdentity forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *).
Monad m =>
((Node -> m [Node]) -> Node -> m [Node]) -> Node -> m [Node]
dfpreM (\Node -> Identity [Node]
k -> forall a. a -> Identity a
Identity forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Node -> [Node]) -> Node -> [Node]
f (forall a. Identity a -> a
runIdentity forall b c a. (b -> c) -> (a -> b) -> a -> c
. Node -> Identity [Node]
k))
dfpreM :: Monad m => ((Node -> m [Node]) -> Node -> m [Node]) -> Node -> m [Node]
dfpreM :: forall (m :: * -> *).
Monad m =>
((Node -> m [Node]) -> Node -> m [Node]) -> Node -> m [Node]
dfpreM (Node -> m [Node]) -> Node -> m [Node]
f = \Node
n0 -> do
[Node]
ns <- (Node -> m [Node]) -> Node -> m [Node]
f (forall (m :: * -> *).
Monad m =>
((Node -> m [Node]) -> Node -> m [Node]) -> Node -> m [Node]
dfpreM (Node -> m [Node]) -> Node -> m [Node]
f) Node
n0
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([Node] -> [Node]
normalize forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. Monad m => m (m a) -> m a
join) forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
t a -> (a -> f b) -> f (t b)
for [Node]
ns forall a b. (a -> b) -> a -> b
$ \Node
n -> do
Cursor
c1 <- forall (m :: * -> *).
Monad m =>
(Node -> m [Node]) -> Cursor -> m Cursor
traverseChildren (forall (m :: * -> *).
Monad m =>
((Node -> m [Node]) -> Node -> m [Node]) -> Node -> m [Node]
dfpreM (Node -> m [Node]) -> Node -> m [Node]
f) (Node -> Cursor
cursorFromNode Node
n)
Cursor -> [Node]
cursorSiblings forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *).
Monad m =>
(Node -> m [Node]) -> Cursor -> m Cursor
traverseRightSiblings (forall (m :: * -> *).
Monad m =>
((Node -> m [Node]) -> Node -> m [Node]) -> Node -> m [Node]
dfpreM (Node -> m [Node]) -> Node -> m [Node]
f) Cursor
c1
data Cursor = Cursor
{ Cursor -> Node
_cursorCurrent :: !Node
, Cursor -> Seq Node
_cursorLefts :: !(Seq Node)
, Cursor -> Seq Node
_cursorRights :: !(Seq Node)
, Cursor -> Seq (Seq Node, Text, HashMap Text Text, Seq Node)
_cursorParents :: !(Seq (Seq Node, T.Text, HM.HashMap T.Text T.Text, Seq Node))
}
traverseChildren :: Monad m => (Node -> m [Node]) -> Cursor -> m Cursor
{-# INLINABLE traverseChildren #-}
traverseChildren :: forall (m :: * -> *).
Monad m =>
(Node -> m [Node]) -> Cursor -> m Cursor
traverseChildren Node -> m [Node]
f Cursor
c0 = case Cursor -> Node
_cursorCurrent Cursor
c0 of
Node_Text Text
_ -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Cursor
c0
Node_Element Text
t HashMap Text Text
as [Node]
cs -> do
[Node]
n1s <- forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([Node] -> [Node]
normalize forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. Monad m => m (m a) -> m a
join) (forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Node -> m [Node]
f [Node]
cs)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Cursor
c0 {_cursorCurrent :: Node
_cursorCurrent = Text -> HashMap Text Text -> [Node] -> Node
Node_Element Text
t HashMap Text Text
as [Node]
n1s})
traverseRightSiblings :: Monad m => (Node -> m [Node]) -> Cursor -> m Cursor
{-# INLINABLE traverseRightSiblings #-}
traverseRightSiblings :: forall (m :: * -> *).
Monad m =>
(Node -> m [Node]) -> Cursor -> m Cursor
traverseRightSiblings Node -> m [Node]
f Cursor
c0 = case Cursor -> Maybe (Node, Cursor)
cursorRemoveRight Cursor
c0 of
Maybe (Node, Cursor)
Nothing -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Cursor
c0
Just (Node
n1, Cursor
c1) -> do
[Node]
n2s <- forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Node] -> [Node]
normalize (Node -> m [Node]
f Node
n1)
forall (m :: * -> *).
Monad m =>
(Node -> m [Node]) -> Cursor -> m Cursor
traverseRightSiblings Node -> m [Node]
f ([Node] -> Cursor -> Cursor
cursorInsertManyRight [Node]
n2s Cursor
c1)
cursorFromNode :: Node -> Cursor
{-# INLINE cursorFromNode #-}
cursorFromNode :: Node -> Cursor
cursorFromNode Node
n = Node
-> Seq Node
-> Seq Node
-> Seq (Seq Node, Text, HashMap Text Text, Seq Node)
-> Cursor
Cursor Node
n forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty
cursorSiblings :: Cursor -> [Node]
{-# INLINE cursorSiblings #-}
cursorSiblings :: Cursor -> [Node]
cursorSiblings (Cursor Node
cur Seq Node
ls Seq Node
rs Seq (Seq Node, Text, HashMap Text Text, Seq Node)
_) =
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList (forall a. Seq a -> Seq a
Seq.reverse Seq Node
ls forall a. Semigroup a => a -> a -> a
<> (Node
cur forall a. a -> Seq a -> Seq a
Seq.<| Seq Node
rs))
cursorRemoveRight :: Cursor -> Maybe (Node, Cursor)
{-# INLINABLE cursorRemoveRight #-}
cursorRemoveRight :: Cursor -> Maybe (Node, Cursor)
cursorRemoveRight = \case
Cursor Node
n Seq Node
ls Seq Node
rs0 Seq (Seq Node, Text, HashMap Text Text, Seq Node)
ps | Bool -> Bool
not (forall a. Seq a -> Bool
Seq.null Seq Node
rs0) ->
case forall a. Seq a -> ViewL a
Seq.viewl Seq Node
rs0 of
Node
r Seq.:< Seq Node
rs -> forall a. a -> Maybe a
Just (Node
r, Node
-> Seq Node
-> Seq Node
-> Seq (Seq Node, Text, HashMap Text Text, Seq Node)
-> Cursor
Cursor Node
n Seq Node
ls Seq Node
rs Seq (Seq Node, Text, HashMap Text Text, Seq Node)
ps)
ViewL Node
_ -> forall a. HasCallStack => a
undefined
Cursor
_ -> forall a. Maybe a
Nothing
cursorInsertManyRight :: [Node] -> Cursor -> Cursor
{-# INLINE cursorInsertManyRight #-}
cursorInsertManyRight :: [Node] -> Cursor -> Cursor
cursorInsertManyRight [Node]
ns (Cursor Node
nn Seq Node
ls Seq Node
rs Seq (Seq Node, Text, HashMap Text Text, Seq Node)
ps) =
Node
-> Seq Node
-> Seq Node
-> Seq (Seq Node, Text, HashMap Text Text, Seq Node)
-> Cursor
Cursor Node
nn Seq Node
ls (forall a. [a] -> Seq a
Seq.fromList [Node]
ns forall a. Semigroup a => a -> a -> a
<> Seq Node
rs) Seq (Seq Node, Text, HashMap Text Text, Seq Node)
ps
encodeUtf8 :: T.Text -> BB.Builder
{-# INLINE encodeUtf8 #-}
encodeUtf8 :: Text -> Builder
encodeUtf8 = Text -> Builder
T.encodeUtf8Builder
encodeXmlUtf8 :: T.Text -> BB.Builder
{-# INLINE encodeXmlUtf8 #-}
encodeXmlUtf8 :: Text -> Builder
encodeXmlUtf8 = BoundedPrim Word8 -> Text -> Builder
T.encodeUtf8BuilderEscaped BoundedPrim Word8
xmlEscaped
encodeXmlUtf8Lazy :: TL.Text -> BB.Builder
{-# INLINE encodeXmlUtf8Lazy #-}
encodeXmlUtf8Lazy :: Text -> Builder
encodeXmlUtf8Lazy = BoundedPrim Word8 -> Text -> Builder
TL.encodeUtf8BuilderEscaped BoundedPrim Word8
xmlEscaped
xmlEscaped :: BBP.BoundedPrim Word8
{-# INLINE xmlEscaped #-}
xmlEscaped :: BoundedPrim Word8
xmlEscaped =
forall a.
(a -> Bool) -> BoundedPrim a -> BoundedPrim a -> BoundedPrim a
BBP.condB (forall a. Eq a => a -> a -> Bool
== Word8
38) ((Word8, (Word8, (Word8, (Word8, Word8)))) -> BoundedPrim Word8
fixed5 (Word8
38,(Word8
97,(Word8
109,(Word8
112,Word8
59))))) forall a b. (a -> b) -> a -> b
$
forall a.
(a -> Bool) -> BoundedPrim a -> BoundedPrim a -> BoundedPrim a
BBP.condB (forall a. Eq a => a -> a -> Bool
== Word8
60) ((Word8, (Word8, (Word8, Word8))) -> BoundedPrim Word8
fixed4 (Word8
38,(Word8
108,(Word8
116,Word8
59)))) forall a b. (a -> b) -> a -> b
$
forall a.
(a -> Bool) -> BoundedPrim a -> BoundedPrim a -> BoundedPrim a
BBP.condB (forall a. Eq a => a -> a -> Bool
== Word8
62) ((Word8, (Word8, (Word8, Word8))) -> BoundedPrim Word8
fixed4 (Word8
38,(Word8
103,(Word8
116,Word8
59)))) forall a b. (a -> b) -> a -> b
$
forall a.
(a -> Bool) -> BoundedPrim a -> BoundedPrim a -> BoundedPrim a
BBP.condB (forall a. Eq a => a -> a -> Bool
== Word8
34) ((Word8, (Word8, (Word8, (Word8, Word8)))) -> BoundedPrim Word8
fixed5 (Word8
38,(Word8
35,(Word8
51,(Word8
52,Word8
59))))) forall a b. (a -> b) -> a -> b
$
forall a. FixedPrim a -> BoundedPrim a
BBP.liftFixedToBounded FixedPrim Word8
BBP.word8
where
{-# INLINE fixed4 #-}
fixed4 :: (Word8, (Word8, (Word8, Word8))) -> BBP.BoundedPrim Word8
fixed4 :: (Word8, (Word8, (Word8, Word8))) -> BoundedPrim Word8
fixed4 (Word8, (Word8, (Word8, Word8)))
x = forall a. FixedPrim a -> BoundedPrim a
BBP.liftFixedToBounded
(forall a b. a -> b -> a
const (Word8, (Word8, (Word8, Word8)))
x forall (f :: * -> *) b a. Contravariant f => (b -> a) -> f a -> f b
BBP.>$< FixedPrim Word8
BBP.word8 forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
BBP.>*< FixedPrim Word8
BBP.word8
forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
BBP.>*< FixedPrim Word8
BBP.word8 forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
BBP.>*< FixedPrim Word8
BBP.word8)
{-# INLINE fixed5 #-}
fixed5 :: (Word8, (Word8, (Word8, (Word8, Word8)))) -> BBP.BoundedPrim Word8
fixed5 :: (Word8, (Word8, (Word8, (Word8, Word8)))) -> BoundedPrim Word8
fixed5 (Word8, (Word8, (Word8, (Word8, Word8))))
x = forall a. FixedPrim a -> BoundedPrim a
BBP.liftFixedToBounded
(forall a b. a -> b -> a
const (Word8, (Word8, (Word8, (Word8, Word8))))
x forall (f :: * -> *) b a. Contravariant f => (b -> a) -> f a -> f b
BBP.>$< FixedPrim Word8
BBP.word8 forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
BBP.>*< FixedPrim Word8
BBP.word8
forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
BBP.>*< FixedPrim Word8
BBP.word8 forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
BBP.>*< FixedPrim Word8
BBP.word8 forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
BBP.>*< FixedPrim Word8
BBP.word8)
mapFromHashMap :: Ord k => HM.HashMap k v -> Map.Map k v
mapFromHashMap :: forall k v. Ord k => HashMap k v -> Map k v
mapFromHashMap = forall k v a. (k -> v -> a -> a) -> a -> HashMap k v -> a
HM.foldrWithKey' forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert forall k a. Map k a
Map.empty
{-# INLINE mapFromHashMap #-}