{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Text.Pandoc.Lua.Topdown
( TraversalNode (..)
, Topdown (..)
, TraversalControl (..)
)
where
import Control.Monad ((>=>))
import Text.Pandoc.Definition
import Text.Pandoc.Lua.Walk
import Text.Pandoc.Walk
data TraversalNode
= TBlock Block
| TBlocks [Block]
| TInline Inline
| TInlines [Inline]
data Topdown = Topdown
{ Topdown -> TraversalControl
topdownControl :: TraversalControl
, Topdown -> TraversalNode
topdownNode :: TraversalNode
}
nodeInlines :: TraversalNode -> [Inline]
nodeInlines :: TraversalNode -> [Inline]
nodeInlines = \case
TInlines [Inline]
xs -> [Inline]
xs
TInline Inline
x -> [Inline
x]
TraversalNode
_ -> forall a. HasCallStack => [Char] -> a
error forall a b. (a -> b) -> a -> b
$ [Char]
"The 'impossible' has happened."
forall a. [a] -> [a] -> [a]
++ [Char]
"Please report this as a bug"
nodeBlocks :: TraversalNode -> [Block]
nodeBlocks :: TraversalNode -> [Block]
nodeBlocks = \case
TBlocks [Block]
xs -> [Block]
xs
TBlock Block
x -> [Block
x]
TInlines [Inline]
xs -> [[Inline] -> Block
Plain [Inline]
xs]
TInline Inline
x -> [[Inline] -> Block
Plain [Inline
x]]
walkTopdownM :: (Monad m, Walkable Topdown a)
=> ([a] -> TraversalNode)
-> (a -> TraversalNode)
-> (TraversalNode -> [a])
-> (Topdown -> m Topdown)
-> [a] -> m [a]
walkTopdownM :: forall (m :: * -> *) a.
(Monad m, Walkable Topdown a) =>
([a] -> TraversalNode)
-> (a -> TraversalNode)
-> (TraversalNode -> [a])
-> (Topdown -> m Topdown)
-> [a]
-> m [a]
walkTopdownM [a] -> TraversalNode
mkListNode a -> TraversalNode
mkElemNode TraversalNode -> [a]
nodeToList Topdown -> m Topdown
f =
Topdown -> m Topdown
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. TraversalControl -> TraversalNode -> Topdown
Topdown TraversalControl
Continue forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> TraversalNode
mkListNode forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> \case
Topdown TraversalControl
Stop TraversalNode
node -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ TraversalNode -> [a]
nodeToList TraversalNode
node
Topdown TraversalControl
Continue TraversalNode
node -> forall a. Monoid a => [a] -> a
mconcat forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (Topdown -> m Topdown
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. TraversalControl -> TraversalNode -> Topdown
Topdown TraversalControl
Continue forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> TraversalNode
mkElemNode forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> \case
Topdown TraversalControl
Stop TraversalNode
node' -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ TraversalNode -> [a]
nodeToList TraversalNode
node'
Topdown TraversalControl
Continue TraversalNode
node' -> forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM Topdown -> m Topdown
f) forall a b. (a -> b) -> a -> b
$
TraversalNode -> [a]
nodeToList TraversalNode
node')
(TraversalNode -> [a]
nodeToList TraversalNode
node)
queryTopdown :: (Monoid a, Walkable Topdown b)
=> ([b] -> TraversalNode)
-> (Topdown -> a) -> [b] -> a
queryTopdown :: forall a b.
(Monoid a, Walkable Topdown b) =>
([b] -> TraversalNode) -> (Topdown -> a) -> [b] -> a
queryTopdown [b] -> TraversalNode
mkListNode Topdown -> a
f [b]
xs =
Topdown -> a
f (TraversalControl -> TraversalNode -> Topdown
Topdown TraversalControl
Continue forall a b. (a -> b) -> a -> b
$ [b] -> TraversalNode
mkListNode [b]
xs) forall a. Semigroup a => a -> a -> a
<> forall a. Monoid a => [a] -> a
mconcat (forall a b. (a -> b) -> [a] -> [b]
map (forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query Topdown -> a
f) [b]
xs)
instance {-# OVERLAPPING #-} Walkable Topdown [Block] where
walkM :: forall (m :: * -> *).
(Monad m, Applicative m, Functor m) =>
(Topdown -> m Topdown) -> [Block] -> m [Block]
walkM = forall (m :: * -> *) a.
(Monad m, Walkable Topdown a) =>
([a] -> TraversalNode)
-> (a -> TraversalNode)
-> (TraversalNode -> [a])
-> (Topdown -> m Topdown)
-> [a]
-> m [a]
walkTopdownM [Block] -> TraversalNode
TBlocks Block -> TraversalNode
TBlock TraversalNode -> [Block]
nodeBlocks
query :: forall c. Monoid c => (Topdown -> c) -> [Block] -> c
query = forall a b.
(Monoid a, Walkable Topdown b) =>
([b] -> TraversalNode) -> (Topdown -> a) -> [b] -> a
queryTopdown [Block] -> TraversalNode
TBlocks
instance {-# OVERLAPPING #-} Walkable Topdown [Inline] where
walkM :: forall (m :: * -> *).
(Monad m, Applicative m, Functor m) =>
(Topdown -> m Topdown) -> [Inline] -> m [Inline]
walkM = forall (m :: * -> *) a.
(Monad m, Walkable Topdown a) =>
([a] -> TraversalNode)
-> (a -> TraversalNode)
-> (TraversalNode -> [a])
-> (Topdown -> m Topdown)
-> [a]
-> m [a]
walkTopdownM [Inline] -> TraversalNode
TInlines Inline -> TraversalNode
TInline TraversalNode -> [Inline]
nodeInlines
query :: forall c. Monoid c => (Topdown -> c) -> [Inline] -> c
query = forall a b.
(Monoid a, Walkable Topdown b) =>
([b] -> TraversalNode) -> (Topdown -> a) -> [b] -> a
queryTopdown [Inline] -> TraversalNode
TInlines
instance Walkable Topdown Block where
walkM :: forall (m :: * -> *).
(Monad m, Applicative m, Functor m) =>
(Topdown -> m Topdown) -> Block -> m Block
walkM = forall a (m :: * -> *).
(Walkable a [Block], Walkable a [Inline], Walkable a Row,
Walkable a Caption, Walkable a TableHead, Walkable a TableBody,
Walkable a TableFoot, Monad m, Applicative m, Functor m) =>
(a -> m a) -> Block -> m Block
walkBlockM
query :: forall c. Monoid c => (Topdown -> c) -> Block -> c
query = forall a c.
(Walkable a Citation, Walkable a [Block], Walkable a Row,
Walkable a Caption, Walkable a TableHead, Walkable a TableBody,
Walkable a TableFoot, Walkable a [Inline], Monoid c) =>
(a -> c) -> Block -> c
queryBlock
instance Walkable Topdown Inline where
walkM :: forall (m :: * -> *).
(Monad m, Applicative m, Functor m) =>
(Topdown -> m Topdown) -> Inline -> m Inline
walkM = forall a (m :: * -> *).
(Walkable a Citation, Walkable a [Block], Walkable a [Inline],
Monad m, Applicative m, Functor m) =>
(a -> m a) -> Inline -> m Inline
walkInlineM
query :: forall c. Monoid c => (Topdown -> c) -> Inline -> c
query = forall a c.
(Walkable a Citation, Walkable a [Block], Walkable a [Inline],
Monoid c) =>
(a -> c) -> Inline -> c
queryInline
instance Walkable Topdown Pandoc where
walkM :: forall (m :: * -> *).
(Monad m, Applicative m, Functor m) =>
(Topdown -> m Topdown) -> Pandoc -> m Pandoc
walkM = forall a (m :: * -> *).
(Walkable a Meta, Walkable a [Block], Monad m, Applicative m,
Functor m) =>
(a -> m a) -> Pandoc -> m Pandoc
walkPandocM
query :: forall c. Monoid c => (Topdown -> c) -> Pandoc -> c
query = forall a c.
(Walkable a Meta, Walkable a [Block], Monoid c) =>
(a -> c) -> Pandoc -> c
queryPandoc
instance Walkable Topdown Citation where
walkM :: forall (m :: * -> *).
(Monad m, Applicative m, Functor m) =>
(Topdown -> m Topdown) -> Citation -> m Citation
walkM = forall a (m :: * -> *).
(Walkable a [Inline], Monad m, Applicative m, Functor m) =>
(a -> m a) -> Citation -> m Citation
walkCitationM
query :: forall c. Monoid c => (Topdown -> c) -> Citation -> c
query = forall a c.
(Walkable a [Inline], Monoid c) =>
(a -> c) -> Citation -> c
queryCitation
instance Walkable Topdown Row where
walkM :: forall (m :: * -> *).
(Monad m, Applicative m, Functor m) =>
(Topdown -> m Topdown) -> Row -> m Row
walkM = forall a (m :: * -> *).
(Walkable a Cell, Monad m) =>
(a -> m a) -> Row -> m Row
walkRowM
query :: forall c. Monoid c => (Topdown -> c) -> Row -> c
query = forall a c. (Walkable a Cell, Monoid c) => (a -> c) -> Row -> c
queryRow
instance Walkable Topdown TableHead where
walkM :: forall (m :: * -> *).
(Monad m, Applicative m, Functor m) =>
(Topdown -> m Topdown) -> TableHead -> m TableHead
walkM = forall a (m :: * -> *).
(Walkable a Row, Monad m) =>
(a -> m a) -> TableHead -> m TableHead
walkTableHeadM
query :: forall c. Monoid c => (Topdown -> c) -> TableHead -> c
query = forall a c.
(Walkable a Row, Monoid c) =>
(a -> c) -> TableHead -> c
queryTableHead
instance Walkable Topdown TableBody where
walkM :: forall (m :: * -> *).
(Monad m, Applicative m, Functor m) =>
(Topdown -> m Topdown) -> TableBody -> m TableBody
walkM = forall a (m :: * -> *).
(Walkable a Row, Monad m) =>
(a -> m a) -> TableBody -> m TableBody
walkTableBodyM
query :: forall c. Monoid c => (Topdown -> c) -> TableBody -> c
query = forall a c.
(Walkable a Row, Monoid c) =>
(a -> c) -> TableBody -> c
queryTableBody
instance Walkable Topdown TableFoot where
walkM :: forall (m :: * -> *).
(Monad m, Applicative m, Functor m) =>
(Topdown -> m Topdown) -> TableFoot -> m TableFoot
walkM = forall a (m :: * -> *).
(Walkable a Row, Monad m) =>
(a -> m a) -> TableFoot -> m TableFoot
walkTableFootM
query :: forall c. Monoid c => (Topdown -> c) -> TableFoot -> c
query = forall a c.
(Walkable a Row, Monoid c) =>
(a -> c) -> TableFoot -> c
queryTableFoot
instance Walkable Topdown Caption where
walkM :: forall (m :: * -> *).
(Monad m, Applicative m, Functor m) =>
(Topdown -> m Topdown) -> Caption -> m Caption
walkM = forall a (m :: * -> *).
(Walkable a [Block], Walkable a [Inline], Monad m,
Walkable a [Inline]) =>
(a -> m a) -> Caption -> m Caption
walkCaptionM
query :: forall c. Monoid c => (Topdown -> c) -> Caption -> c
query = forall a c.
(Walkable a [Block], Walkable a [Inline], Walkable a [Inline],
Monoid c) =>
(a -> c) -> Caption -> c
queryCaption
instance Walkable Topdown Cell where
walkM :: forall (m :: * -> *).
(Monad m, Applicative m, Functor m) =>
(Topdown -> m Topdown) -> Cell -> m Cell
walkM = forall a (m :: * -> *).
(Walkable a [Block], Monad m) =>
(a -> m a) -> Cell -> m Cell
walkCellM
query :: forall c. Monoid c => (Topdown -> c) -> Cell -> c
query = forall a c. (Walkable a [Block], Monoid c) => (a -> c) -> Cell -> c
queryCell
instance Walkable Topdown MetaValue where
walkM :: forall (m :: * -> *).
(Monad m, Applicative m, Functor m) =>
(Topdown -> m Topdown) -> MetaValue -> m MetaValue
walkM = forall a (f :: * -> *).
(Walkable a MetaValue, Walkable a [Block], Walkable a [Inline],
Monad f, Applicative f, Functor f) =>
(a -> f a) -> MetaValue -> f MetaValue
walkMetaValueM
query :: forall c. Monoid c => (Topdown -> c) -> MetaValue -> c
query = forall a c.
(Walkable a MetaValue, Walkable a [Block], Walkable a [Inline],
Monoid c) =>
(a -> c) -> MetaValue -> c
queryMetaValue
instance Walkable Topdown Meta where
walkM :: forall (m :: * -> *).
(Monad m, Applicative m, Functor m) =>
(Topdown -> m Topdown) -> Meta -> m Meta
walkM Topdown -> m Topdown
f (Meta Map Text MetaValue
metamap) = Map Text MetaValue -> Meta
Meta forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM Topdown -> m Topdown
f Map Text MetaValue
metamap
query :: forall c. Monoid c => (Topdown -> c) -> Meta -> c
query Topdown -> c
f (Meta Map Text MetaValue
metamap) = forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query Topdown -> c
f Map Text MetaValue
metamap