{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE CPP #-}
#if MIN_VERSION_base(4,9,0)
{-# OPTIONS_GHC -fno-warn-redundant-constraints -O2 #-}
#endif
#define OVERLAPS {-# OVERLAPPING #-}
{-
Copyright (c) 2013-2019, John MacFarlane

All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above
      copyright notice, this list of conditions and the following
      disclaimer in the documentation and/or other materials provided
      with the distribution.

    * Neither the name of John MacFarlane nor the names of other
      contributors may be used to endorse or promote products derived
      from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-}

{- |
   Module      : Text.Pandoc.Walk
   Copyright   : Copyright (C) 2013-2019 John MacFarlane
   License     : BSD3

   Maintainer  : John MacFarlane <jgm@berkeley.edu>
   Stability   : alpha
   Portability : portable

Functions for manipulating 'Pandoc' documents or extracting
information from them by walking the 'Pandoc' structure (or
intermediate structures like '[Block]' or '[Inline]'.
These are faster (by a factor of four or five) than the generic
functions defined in @Text.Pandoc.Generic@.

Here's a simple example, defining a function that replaces all the level 3+
headers in a document with regular paragraphs in ALL CAPS:

> import Text.Pandoc.Definition
> import Text.Pandoc.Walk
> import Data.Char (toUpper)
>
> modHeader :: Block -> Block
> modHeader (Header n _ xs) | n >= 3 = Para $ walk allCaps xs
> modHeader x = x
>
> allCaps :: Inline -> Inline
> allCaps (Str xs) = Str $ map toUpper xs
> allCaps x = x
>
> changeHeaders :: Pandoc -> Pandoc
> changeHeaders = walk modHeader

'query' can be used, for example, to compile a list of URLs
linked to in a document:

> extractURL :: Inline -> [String]
> extractURL (Link _ _ (u,_)) = [u]
> extractURL (Image _ _ (u,_)) = [u]
> extractURL _ = []
>
> extractURLs :: Pandoc -> [String]
> extractURLs = query extractURL
-}


module Text.Pandoc.Walk
  ( Walkable(..)
  , queryBlock
  , queryCitation
  , queryInline
  , queryMetaValue
  , queryPandoc
  , walkBlockM
  , walkCitationM
  , walkInlineM
  , walkMetaValueM
  , walkPandocM
  )
where
import Control.Applicative (Applicative ((<*>), pure), (<$>))
import Control.Monad ((>=>))
import Data.Functor.Identity (Identity (runIdentity))
import Text.Pandoc.Definition
import qualified Data.Traversable as T
import Data.Traversable (Traversable)
import qualified Data.Foldable as F
import Data.Foldable (Foldable)
import Data.Monoid ((<>))

class Walkable a b where
  -- | @walk f x@ walks the structure @x@ (bottom up) and replaces every
  -- occurrence of an @a@ with the result of applying @f@ to it.
  walk  :: (a -> a) -> b -> b
  walk f :: a -> a
f = Identity b -> b
forall a. Identity a -> a
runIdentity (Identity b -> b) -> (b -> Identity b) -> b -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Identity a) -> b -> Identity b
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM (a -> Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> Identity a) -> (a -> a) -> a -> Identity a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a
f)
  -- | A monadic version of 'walk'.
  walkM :: (Monad m, Applicative m, Functor m) => (a -> m a) -> b -> m b
  -- | @query f x@ walks the structure @x@ (bottom up) and applies @f@
  -- to every @a@, appending the results.
  query :: Monoid c => (a -> c) -> b -> c
  {-# MINIMAL walkM, query #-}

instance (Foldable t, Traversable t, Walkable a b) => Walkable a (t b) where
  walk :: (a -> a) -> t b -> t b
walk f :: a -> a
f  = (b -> b) -> t b -> t b
forall (t :: * -> *) a b. Traversable t => (a -> b) -> t a -> t b
T.fmapDefault ((a -> a) -> b -> b
forall a b. Walkable a b => (a -> a) -> b -> b
walk a -> a
f)
  walkM :: (a -> m a) -> t b -> m (t b)
walkM f :: a -> m a
f = (b -> m b) -> t b -> m (t b)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
T.mapM ((a -> m a) -> b -> m b
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f)
  query :: (a -> c) -> t b -> c
query f :: a -> c
f = (b -> c) -> t b -> c
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
F.foldMap ((a -> c) -> b -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f)

-- Walk pairs by handling both elements, then combine the results.
instance OVERLAPS
        (Walkable a b, Walkable a c) => Walkable a (b,c) where
  walk :: (a -> a) -> (b, c) -> (b, c)
walk f :: a -> a
f (x :: b
x,y :: c
y)  = ((a -> a) -> b -> b
forall a b. Walkable a b => (a -> a) -> b -> b
walk a -> a
f b
x, (a -> a) -> c -> c
forall a b. Walkable a b => (a -> a) -> b -> b
walk a -> a
f c
y)
  walkM :: (a -> m a) -> (b, c) -> m (b, c)
walkM f :: a -> m a
f (x :: b
x,y :: c
y) = do b
x' <- (a -> m a) -> b -> m b
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f b
x
                     c
y' <- (a -> m a) -> c -> m c
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f c
y
                     (b, c) -> m (b, c)
forall (m :: * -> *) a. Monad m => a -> m a
return (b
x',c
y')
  query :: (a -> c) -> (b, c) -> c
query f :: a -> c
f (x :: b
x,y :: c
y) = c -> c -> c
forall a. Monoid a => a -> a -> a
mappend ((a -> c) -> b -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f b
x) ((a -> c) -> c -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f c
y)

instance Walkable Inline Inline where
  walkM :: (Inline -> m Inline) -> Inline -> m Inline
walkM f :: Inline -> m Inline
f x :: Inline
x = (Inline -> m Inline) -> Inline -> m Inline
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 Inline -> m Inline
f Inline
x m Inline -> (Inline -> m Inline) -> m Inline
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Inline -> m Inline
f
  query :: (Inline -> c) -> Inline -> c
query f :: Inline -> c
f x :: Inline
x = Inline -> c
f Inline
x c -> c -> c
forall a. Semigroup a => a -> a -> a
<> (Inline -> c) -> Inline -> c
forall a c.
(Walkable a Citation, Walkable a [Block], Walkable a [Inline],
 Monoid c) =>
(a -> c) -> Inline -> c
queryInline Inline -> c
f Inline
x

instance OVERLAPS
         Walkable [Inline] [Inline] where
  walkM :: ([Inline] -> m [Inline]) -> [Inline] -> m [Inline]
walkM f :: [Inline] -> m [Inline]
f = (Inline -> m Inline) -> [Inline] -> m [Inline]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
T.traverse (([Inline] -> m [Inline]) -> Inline -> m Inline
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 [Inline] -> m [Inline]
f) ([Inline] -> m [Inline])
-> ([Inline] -> m [Inline]) -> [Inline] -> m [Inline]
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> [Inline] -> m [Inline]
f
  query :: ([Inline] -> c) -> [Inline] -> c
query f :: [Inline] -> c
f inlns :: [Inline]
inlns = [Inline] -> c
f [Inline]
inlns c -> c -> c
forall a. Semigroup a => a -> a -> a
<> [c] -> c
forall a. Monoid a => [a] -> a
mconcat ((Inline -> c) -> [Inline] -> [c]
forall a b. (a -> b) -> [a] -> [b]
map (([Inline] -> c) -> Inline -> c
forall a c.
(Walkable a Citation, Walkable a [Block], Walkable a [Inline],
 Monoid c) =>
(a -> c) -> Inline -> c
queryInline [Inline] -> c
f) [Inline]
inlns)

instance Walkable [Inline] Inline where
  walkM :: ([Inline] -> m [Inline]) -> Inline -> m Inline
walkM = ([Inline] -> m [Inline]) -> Inline -> m Inline
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 :: ([Inline] -> c) -> Inline -> c
query = ([Inline] -> c) -> Inline -> c
forall a c.
(Walkable a Citation, Walkable a [Block], Walkable a [Inline],
 Monoid c) =>
(a -> c) -> Inline -> c
queryInline

instance Walkable Inline Block where
  walkM :: (Inline -> m Inline) -> Block -> m Block
walkM = (Inline -> m Inline) -> Block -> m Block
forall a (m :: * -> *).
(Walkable a [Block], Walkable a [Inline], Monad m, Applicative m,
 Functor m) =>
(a -> m a) -> Block -> m Block
walkBlockM
  query :: (Inline -> c) -> Block -> c
query = (Inline -> c) -> Block -> c
forall a c.
(Walkable a Citation, Walkable a [Block], Walkable a [Inline],
 Monoid c) =>
(a -> c) -> Block -> c
queryBlock

instance Walkable [Inline] Block where
  walkM :: ([Inline] -> m [Inline]) -> Block -> m Block
walkM = ([Inline] -> m [Inline]) -> Block -> m Block
forall a (m :: * -> *).
(Walkable a [Block], Walkable a [Inline], Monad m, Applicative m,
 Functor m) =>
(a -> m a) -> Block -> m Block
walkBlockM
  query :: ([Inline] -> c) -> Block -> c
query = ([Inline] -> c) -> Block -> c
forall a c.
(Walkable a Citation, Walkable a [Block], Walkable a [Inline],
 Monoid c) =>
(a -> c) -> Block -> c
queryBlock

instance Walkable Block Block where
  walkM :: (Block -> m Block) -> Block -> m Block
walkM f :: Block -> m Block
f x :: Block
x = (Block -> m Block) -> Block -> m Block
forall a (m :: * -> *).
(Walkable a [Block], Walkable a [Inline], Monad m, Applicative m,
 Functor m) =>
(a -> m a) -> Block -> m Block
walkBlockM Block -> m Block
f Block
x m Block -> (Block -> m Block) -> m Block
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Block -> m Block
f
  query :: (Block -> c) -> Block -> c
query f :: Block -> c
f x :: Block
x = Block -> c
f Block
x c -> c -> c
forall a. Semigroup a => a -> a -> a
<> (Block -> c) -> Block -> c
forall a c.
(Walkable a Citation, Walkable a [Block], Walkable a [Inline],
 Monoid c) =>
(a -> c) -> Block -> c
queryBlock Block -> c
f Block
x

instance Walkable [Block] Block where
  walkM :: ([Block] -> m [Block]) -> Block -> m Block
walkM = ([Block] -> m [Block]) -> Block -> m Block
forall a (m :: * -> *).
(Walkable a [Block], Walkable a [Inline], Monad m, Applicative m,
 Functor m) =>
(a -> m a) -> Block -> m Block
walkBlockM
  query :: ([Block] -> c) -> Block -> c
query = ([Block] -> c) -> Block -> c
forall a c.
(Walkable a Citation, Walkable a [Block], Walkable a [Inline],
 Monoid c) =>
(a -> c) -> Block -> c
queryBlock

instance OVERLAPS
         Walkable [Block] [Block] where
  walkM :: ([Block] -> m [Block]) -> [Block] -> m [Block]
walkM f :: [Block] -> m [Block]
f = (Block -> m Block) -> [Block] -> m [Block]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
T.traverse (([Block] -> m [Block]) -> Block -> m Block
forall a (m :: * -> *).
(Walkable a [Block], Walkable a [Inline], Monad m, Applicative m,
 Functor m) =>
(a -> m a) -> Block -> m Block
walkBlockM [Block] -> m [Block]
f) ([Block] -> m [Block])
-> ([Block] -> m [Block]) -> [Block] -> m [Block]
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> [Block] -> m [Block]
f
  query :: ([Block] -> c) -> [Block] -> c
query f :: [Block] -> c
f blks :: [Block]
blks = [Block] -> c
f [Block]
blks c -> c -> c
forall a. Semigroup a => a -> a -> a
<> [c] -> c
forall a. Monoid a => [a] -> a
mconcat ((Block -> c) -> [Block] -> [c]
forall a b. (a -> b) -> [a] -> [b]
map (([Block] -> c) -> Block -> c
forall a c.
(Walkable a Citation, Walkable a [Block], Walkable a [Inline],
 Monoid c) =>
(a -> c) -> Block -> c
queryBlock [Block] -> c
f) [Block]
blks)

instance Walkable Block Inline where
  walkM :: (Block -> m Block) -> Inline -> m Inline
walkM = (Block -> m Block) -> Inline -> m Inline
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 :: (Block -> c) -> Inline -> c
query = (Block -> c) -> Inline -> c
forall a c.
(Walkable a Citation, Walkable a [Block], Walkable a [Inline],
 Monoid c) =>
(a -> c) -> Inline -> c
queryInline

instance Walkable [Block] Inline where
  walkM :: ([Block] -> m [Block]) -> Inline -> m Inline
walkM = ([Block] -> m [Block]) -> Inline -> m Inline
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 :: ([Block] -> c) -> Inline -> c
query = ([Block] -> c) -> Inline -> c
forall a c.
(Walkable a Citation, Walkable a [Block], Walkable a [Inline],
 Monoid c) =>
(a -> c) -> Inline -> c
queryInline

--
-- Walk Pandoc
--
instance Walkable Block Pandoc where
  walkM :: (Block -> m Block) -> Pandoc -> m Pandoc
walkM = (Block -> m Block) -> Pandoc -> m Pandoc
forall a (m :: * -> *).
(Walkable a Meta, Walkable a [Block], Monad m, Applicative m,
 Functor m) =>
(a -> m a) -> Pandoc -> m Pandoc
walkPandocM
  query :: (Block -> c) -> Pandoc -> c
query = (Block -> c) -> Pandoc -> c
forall a c.
(Walkable a Meta, Walkable a [Block], Monoid c) =>
(a -> c) -> Pandoc -> c
queryPandoc

instance Walkable [Block] Pandoc where
  walkM :: ([Block] -> m [Block]) -> Pandoc -> m Pandoc
walkM = ([Block] -> m [Block]) -> Pandoc -> m Pandoc
forall a (m :: * -> *).
(Walkable a Meta, Walkable a [Block], Monad m, Applicative m,
 Functor m) =>
(a -> m a) -> Pandoc -> m Pandoc
walkPandocM
  query :: ([Block] -> c) -> Pandoc -> c
query = ([Block] -> c) -> Pandoc -> c
forall a c.
(Walkable a Meta, Walkable a [Block], Monoid c) =>
(a -> c) -> Pandoc -> c
queryPandoc

instance Walkable Inline Pandoc where
  walkM :: (Inline -> m Inline) -> Pandoc -> m Pandoc
walkM = (Inline -> m Inline) -> Pandoc -> m Pandoc
forall a (m :: * -> *).
(Walkable a Meta, Walkable a [Block], Monad m, Applicative m,
 Functor m) =>
(a -> m a) -> Pandoc -> m Pandoc
walkPandocM
  query :: (Inline -> c) -> Pandoc -> c
query = (Inline -> c) -> Pandoc -> c
forall a c.
(Walkable a Meta, Walkable a [Block], Monoid c) =>
(a -> c) -> Pandoc -> c
queryPandoc

instance Walkable [Inline] Pandoc where
  walkM :: ([Inline] -> m [Inline]) -> Pandoc -> m Pandoc
walkM = ([Inline] -> m [Inline]) -> Pandoc -> m Pandoc
forall a (m :: * -> *).
(Walkable a Meta, Walkable a [Block], Monad m, Applicative m,
 Functor m) =>
(a -> m a) -> Pandoc -> m Pandoc
walkPandocM
  query :: ([Inline] -> c) -> Pandoc -> c
query = ([Inline] -> c) -> Pandoc -> c
forall a c.
(Walkable a Meta, Walkable a [Block], Monoid c) =>
(a -> c) -> Pandoc -> c
queryPandoc

instance Walkable Pandoc Pandoc where
  walkM :: (Pandoc -> m Pandoc) -> Pandoc -> m Pandoc
walkM f :: Pandoc -> m Pandoc
f = Pandoc -> m Pandoc
f
  query :: (Pandoc -> c) -> Pandoc -> c
query f :: Pandoc -> c
f = Pandoc -> c
f

--
-- Walk Meta
--
instance Walkable Meta Meta where
  walkM :: (Meta -> m Meta) -> Meta -> m Meta
walkM f :: Meta -> m Meta
f = Meta -> m Meta
f
  query :: (Meta -> c) -> Meta -> c
query f :: Meta -> c
f = Meta -> c
f

instance Walkable Inline Meta where
  walkM :: (Inline -> m Inline) -> Meta -> m Meta
walkM f :: Inline -> m Inline
f (Meta metamap :: Map Text MetaValue
metamap) = Map Text MetaValue -> Meta
Meta (Map Text MetaValue -> Meta) -> m (Map Text MetaValue) -> m Meta
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Inline -> m Inline)
-> Map Text MetaValue -> m (Map Text MetaValue)
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM Inline -> m Inline
f Map Text MetaValue
metamap
  query :: (Inline -> c) -> Meta -> c
query f :: Inline -> c
f (Meta metamap :: Map Text MetaValue
metamap) = (Inline -> c) -> Map Text MetaValue -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query Inline -> c
f Map Text MetaValue
metamap

instance Walkable [Inline] Meta where
  walkM :: ([Inline] -> m [Inline]) -> Meta -> m Meta
walkM f :: [Inline] -> m [Inline]
f (Meta metamap :: Map Text MetaValue
metamap) = Map Text MetaValue -> Meta
Meta (Map Text MetaValue -> Meta) -> m (Map Text MetaValue) -> m Meta
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ([Inline] -> m [Inline])
-> Map Text MetaValue -> m (Map Text MetaValue)
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM [Inline] -> m [Inline]
f Map Text MetaValue
metamap
  query :: ([Inline] -> c) -> Meta -> c
query f :: [Inline] -> c
f (Meta metamap :: Map Text MetaValue
metamap) = ([Inline] -> c) -> Map Text MetaValue -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query [Inline] -> c
f Map Text MetaValue
metamap

instance Walkable Block Meta where
  walkM :: (Block -> m Block) -> Meta -> m Meta
walkM f :: Block -> m Block
f (Meta metamap :: Map Text MetaValue
metamap) = Map Text MetaValue -> Meta
Meta (Map Text MetaValue -> Meta) -> m (Map Text MetaValue) -> m Meta
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Block -> m Block) -> Map Text MetaValue -> m (Map Text MetaValue)
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM Block -> m Block
f Map Text MetaValue
metamap
  query :: (Block -> c) -> Meta -> c
query f :: Block -> c
f (Meta metamap :: Map Text MetaValue
metamap) = (Block -> c) -> Map Text MetaValue -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query Block -> c
f Map Text MetaValue
metamap

instance Walkable [Block] Meta where
  walkM :: ([Block] -> m [Block]) -> Meta -> m Meta
walkM f :: [Block] -> m [Block]
f (Meta metamap :: Map Text MetaValue
metamap) = Map Text MetaValue -> Meta
Meta (Map Text MetaValue -> Meta) -> m (Map Text MetaValue) -> m Meta
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ([Block] -> m [Block])
-> Map Text MetaValue -> m (Map Text MetaValue)
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM [Block] -> m [Block]
f Map Text MetaValue
metamap
  query :: ([Block] -> c) -> Meta -> c
query f :: [Block] -> c
f (Meta metamap :: Map Text MetaValue
metamap) = ([Block] -> c) -> Map Text MetaValue -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query [Block] -> c
f Map Text MetaValue
metamap

--
-- Walk MetaValue
--
instance Walkable Inline MetaValue where
  walkM :: (Inline -> m Inline) -> MetaValue -> m MetaValue
walkM = (Inline -> m Inline) -> MetaValue -> m MetaValue
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 :: (Inline -> c) -> MetaValue -> c
query = (Inline -> c) -> MetaValue -> c
forall a c.
(Walkable a MetaValue, Walkable a [Block], Walkable a [Inline],
 Monoid c) =>
(a -> c) -> MetaValue -> c
queryMetaValue

instance Walkable [Inline] MetaValue where
  walkM :: ([Inline] -> m [Inline]) -> MetaValue -> m MetaValue
walkM = ([Inline] -> m [Inline]) -> MetaValue -> m MetaValue
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 :: ([Inline] -> c) -> MetaValue -> c
query = ([Inline] -> c) -> MetaValue -> c
forall a c.
(Walkable a MetaValue, Walkable a [Block], Walkable a [Inline],
 Monoid c) =>
(a -> c) -> MetaValue -> c
queryMetaValue

instance Walkable Block MetaValue where
  walkM :: (Block -> m Block) -> MetaValue -> m MetaValue
walkM = (Block -> m Block) -> MetaValue -> m MetaValue
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 :: (Block -> c) -> MetaValue -> c
query = (Block -> c) -> MetaValue -> c
forall a c.
(Walkable a MetaValue, Walkable a [Block], Walkable a [Inline],
 Monoid c) =>
(a -> c) -> MetaValue -> c
queryMetaValue

instance Walkable [Block] MetaValue where
  walkM :: ([Block] -> m [Block]) -> MetaValue -> m MetaValue
walkM = ([Block] -> m [Block]) -> MetaValue -> m MetaValue
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 :: ([Block] -> c) -> MetaValue -> c
query = ([Block] -> c) -> MetaValue -> c
forall a c.
(Walkable a MetaValue, Walkable a [Block], Walkable a [Inline],
 Monoid c) =>
(a -> c) -> MetaValue -> c
queryMetaValue

--
-- Walk Citation
--
instance Walkable Inline Citation where
  walkM :: (Inline -> m Inline) -> Citation -> m Citation
walkM = (Inline -> m Inline) -> Citation -> m Citation
forall a (m :: * -> *).
(Walkable a [Inline], Monad m, Applicative m, Functor m) =>
(a -> m a) -> Citation -> m Citation
walkCitationM
  query :: (Inline -> c) -> Citation -> c
query = (Inline -> c) -> Citation -> c
forall a c.
(Walkable a [Inline], Monoid c) =>
(a -> c) -> Citation -> c
queryCitation

instance Walkable [Inline] Citation where
  walkM :: ([Inline] -> m [Inline]) -> Citation -> m Citation
walkM = ([Inline] -> m [Inline]) -> Citation -> m Citation
forall a (m :: * -> *).
(Walkable a [Inline], Monad m, Applicative m, Functor m) =>
(a -> m a) -> Citation -> m Citation
walkCitationM
  query :: ([Inline] -> c) -> Citation -> c
query = ([Inline] -> c) -> Citation -> c
forall a c.
(Walkable a [Inline], Monoid c) =>
(a -> c) -> Citation -> c
queryCitation

instance Walkable Block Citation where
  walkM :: (Block -> m Block) -> Citation -> m Citation
walkM = (Block -> m Block) -> Citation -> m Citation
forall a (m :: * -> *).
(Walkable a [Inline], Monad m, Applicative m, Functor m) =>
(a -> m a) -> Citation -> m Citation
walkCitationM
  query :: (Block -> c) -> Citation -> c
query = (Block -> c) -> Citation -> c
forall a c.
(Walkable a [Inline], Monoid c) =>
(a -> c) -> Citation -> c
queryCitation

instance Walkable [Block] Citation where
  walkM :: ([Block] -> m [Block]) -> Citation -> m Citation
walkM = ([Block] -> m [Block]) -> Citation -> m Citation
forall a (m :: * -> *).
(Walkable a [Inline], Monad m, Applicative m, Functor m) =>
(a -> m a) -> Citation -> m Citation
walkCitationM
  query :: ([Block] -> c) -> Citation -> c
query = ([Block] -> c) -> Citation -> c
forall a c.
(Walkable a [Inline], Monoid c) =>
(a -> c) -> Citation -> c
queryCitation

-- | Helper method to walk to elements nested below @'Inline'@ nodes.
--
-- When walking an inline with this function, only the contents of the traversed
-- inline element may change. The element itself, i.e. its constructor, cannot
-- be changed.
walkInlineM :: (Walkable a Citation, Walkable a [Block],
                Walkable a [Inline], Monad m, Applicative m, Functor m)
            => (a -> m a) -> Inline -> m Inline
walkInlineM :: (a -> m a) -> Inline -> m Inline
walkInlineM _ (Str xs :: Text
xs)         = Inline -> m Inline
forall (m :: * -> *) a. Monad m => a -> m a
return (Text -> Inline
Str Text
xs)
walkInlineM f :: a -> m a
f (Emph xs :: [Inline]
xs)        = [Inline] -> Inline
Emph ([Inline] -> Inline) -> m [Inline] -> m Inline
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [Inline] -> m [Inline]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Inline]
xs
walkInlineM f :: a -> m a
f (Strong xs :: [Inline]
xs)      = [Inline] -> Inline
Strong ([Inline] -> Inline) -> m [Inline] -> m Inline
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [Inline] -> m [Inline]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Inline]
xs
walkInlineM f :: a -> m a
f (Strikeout xs :: [Inline]
xs)   = [Inline] -> Inline
Strikeout ([Inline] -> Inline) -> m [Inline] -> m Inline
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [Inline] -> m [Inline]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Inline]
xs
walkInlineM f :: a -> m a
f (Subscript xs :: [Inline]
xs)   = [Inline] -> Inline
Subscript ([Inline] -> Inline) -> m [Inline] -> m Inline
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [Inline] -> m [Inline]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Inline]
xs
walkInlineM f :: a -> m a
f (Superscript xs :: [Inline]
xs) = [Inline] -> Inline
Superscript ([Inline] -> Inline) -> m [Inline] -> m Inline
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [Inline] -> m [Inline]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Inline]
xs
walkInlineM f :: a -> m a
f (SmallCaps xs :: [Inline]
xs)   = [Inline] -> Inline
SmallCaps ([Inline] -> Inline) -> m [Inline] -> m Inline
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [Inline] -> m [Inline]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Inline]
xs
walkInlineM f :: a -> m a
f (Quoted qt :: QuoteType
qt xs :: [Inline]
xs)   = QuoteType -> [Inline] -> Inline
Quoted QuoteType
qt ([Inline] -> Inline) -> m [Inline] -> m Inline
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [Inline] -> m [Inline]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Inline]
xs
walkInlineM f :: a -> m a
f (Link atr :: Attr
atr xs :: [Inline]
xs t :: Target
t)  = Attr -> [Inline] -> Target -> Inline
Link Attr
atr ([Inline] -> Target -> Inline)
-> m [Inline] -> m (Target -> Inline)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [Inline] -> m [Inline]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Inline]
xs m (Target -> Inline) -> m Target -> m Inline
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Target -> m Target
forall (f :: * -> *) a. Applicative f => a -> f a
pure Target
t
walkInlineM f :: a -> m a
f (Image atr :: Attr
atr xs :: [Inline]
xs t :: Target
t) = Attr -> [Inline] -> Target -> Inline
Image Attr
atr ([Inline] -> Target -> Inline)
-> m [Inline] -> m (Target -> Inline)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [Inline] -> m [Inline]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Inline]
xs m (Target -> Inline) -> m Target -> m Inline
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Target -> m Target
forall (f :: * -> *) a. Applicative f => a -> f a
pure Target
t
walkInlineM f :: a -> m a
f (Note bs :: [Block]
bs)        = [Block] -> Inline
Note ([Block] -> Inline) -> m [Block] -> m Inline
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [Block] -> m [Block]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Block]
bs
walkInlineM f :: a -> m a
f (Span attr :: Attr
attr xs :: [Inline]
xs)   = Attr -> [Inline] -> Inline
Span Attr
attr ([Inline] -> Inline) -> m [Inline] -> m Inline
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [Inline] -> m [Inline]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Inline]
xs
walkInlineM f :: a -> m a
f (Cite cs :: [Citation]
cs xs :: [Inline]
xs)     = [Citation] -> [Inline] -> Inline
Cite ([Citation] -> [Inline] -> Inline)
-> m [Citation] -> m ([Inline] -> Inline)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [Citation] -> m [Citation]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Citation]
cs m ([Inline] -> Inline) -> m [Inline] -> m Inline
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (a -> m a) -> [Inline] -> m [Inline]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Inline]
xs
walkInlineM _ LineBreak        = Inline -> m Inline
forall (m :: * -> *) a. Monad m => a -> m a
return Inline
LineBreak
walkInlineM _ SoftBreak        = Inline -> m Inline
forall (m :: * -> *) a. Monad m => a -> m a
return Inline
SoftBreak
walkInlineM _ Space            = Inline -> m Inline
forall (m :: * -> *) a. Monad m => a -> m a
return Inline
Space
walkInlineM _ x :: Inline
x@Code {}        = Inline -> m Inline
forall (m :: * -> *) a. Monad m => a -> m a
return Inline
x
walkInlineM _ x :: Inline
x@Math {}        = Inline -> m Inline
forall (m :: * -> *) a. Monad m => a -> m a
return Inline
x
walkInlineM _ x :: Inline
x@RawInline {}   = Inline -> m Inline
forall (m :: * -> *) a. Monad m => a -> m a
return Inline
x

-- | Perform a query on elements nested below an @'Inline'@ element by
-- querying nested lists of @Inline@s, @Block@s, or @Citation@s.
queryInline :: (Walkable a Citation, Walkable a [Block],
                Walkable a [Inline], Monoid c)
            => (a -> c) -> Inline -> c
queryInline :: (a -> c) -> Inline -> c
queryInline _ (Str _)         = c
forall a. Monoid a => a
mempty
queryInline f :: a -> c
f (Emph xs :: [Inline]
xs)       = (a -> c) -> [Inline] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Inline]
xs
queryInline f :: a -> c
f (Strong xs :: [Inline]
xs)     = (a -> c) -> [Inline] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Inline]
xs
queryInline f :: a -> c
f (Strikeout xs :: [Inline]
xs)  = (a -> c) -> [Inline] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Inline]
xs
queryInline f :: a -> c
f (Subscript xs :: [Inline]
xs)  = (a -> c) -> [Inline] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Inline]
xs
queryInline f :: a -> c
f (Superscript xs :: [Inline]
xs)= (a -> c) -> [Inline] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Inline]
xs
queryInline f :: a -> c
f (SmallCaps xs :: [Inline]
xs)  = (a -> c) -> [Inline] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Inline]
xs
queryInline f :: a -> c
f (Quoted _ xs :: [Inline]
xs)   = (a -> c) -> [Inline] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Inline]
xs
queryInline f :: a -> c
f (Cite cs :: [Citation]
cs xs :: [Inline]
xs)    = (a -> c) -> [Citation] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Citation]
cs c -> c -> c
forall a. Semigroup a => a -> a -> a
<> (a -> c) -> [Inline] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Inline]
xs
queryInline _ (Code _ _)      = c
forall a. Monoid a => a
mempty
queryInline _ Space           = c
forall a. Monoid a => a
mempty
queryInline _ SoftBreak       = c
forall a. Monoid a => a
mempty
queryInline _ LineBreak       = c
forall a. Monoid a => a
mempty
queryInline _ (Math _ _)      = c
forall a. Monoid a => a
mempty
queryInline _ (RawInline _ _) = c
forall a. Monoid a => a
mempty
queryInline f :: a -> c
f (Link _ xs :: [Inline]
xs _)   = (a -> c) -> [Inline] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Inline]
xs
queryInline f :: a -> c
f (Image _ xs :: [Inline]
xs _)  = (a -> c) -> [Inline] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Inline]
xs
queryInline f :: a -> c
f (Note bs :: [Block]
bs)       = (a -> c) -> [Block] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Block]
bs
queryInline f :: a -> c
f (Span _ xs :: [Inline]
xs)     = (a -> c) -> [Inline] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Inline]
xs


-- | Helper method to walk to elements nested below @'Block'@ nodes.
--
-- When walking a block with this function, only the contents of the traversed
-- block element may change. The element itself, i.e. its constructor, its @'Attr'@,
-- and its raw text value, will remain unchanged.
walkBlockM :: (Walkable a [Block], Walkable a [Inline], Monad m,
                Applicative m, Functor m)
           => (a -> m a) -> Block -> m Block
walkBlockM :: (a -> m a) -> Block -> m Block
walkBlockM f :: a -> m a
f (Para xs :: [Inline]
xs)                = [Inline] -> Block
Para ([Inline] -> Block) -> m [Inline] -> m Block
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [Inline] -> m [Inline]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Inline]
xs
walkBlockM f :: a -> m a
f (Plain xs :: [Inline]
xs)               = [Inline] -> Block
Plain ([Inline] -> Block) -> m [Inline] -> m Block
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [Inline] -> m [Inline]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Inline]
xs
walkBlockM f :: a -> m a
f (LineBlock xs :: [[Inline]]
xs)           = [[Inline]] -> Block
LineBlock ([[Inline]] -> Block) -> m [[Inline]] -> m Block
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [[Inline]] -> m [[Inline]]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [[Inline]]
xs
walkBlockM f :: a -> m a
f (BlockQuote xs :: [Block]
xs)          = [Block] -> Block
BlockQuote ([Block] -> Block) -> m [Block] -> m Block
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [Block] -> m [Block]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Block]
xs
walkBlockM f :: a -> m a
f (OrderedList a :: ListAttributes
a cs :: [[Block]]
cs)       = ListAttributes -> [[Block]] -> Block
OrderedList ListAttributes
a ([[Block]] -> Block) -> m [[Block]] -> m Block
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [[Block]] -> m [[Block]]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [[Block]]
cs
walkBlockM f :: a -> m a
f (BulletList cs :: [[Block]]
cs)          = [[Block]] -> Block
BulletList ([[Block]] -> Block) -> m [[Block]] -> m Block
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [[Block]] -> m [[Block]]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [[Block]]
cs
walkBlockM f :: a -> m a
f (DefinitionList xs :: [([Inline], [[Block]])]
xs)      = [([Inline], [[Block]])] -> Block
DefinitionList ([([Inline], [[Block]])] -> Block)
-> m [([Inline], [[Block]])] -> m Block
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [([Inline], [[Block]])] -> m [([Inline], [[Block]])]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [([Inline], [[Block]])]
xs
walkBlockM f :: a -> m a
f (Header lev :: Int
lev attr :: Attr
attr xs :: [Inline]
xs)     = Int -> Attr -> [Inline] -> Block
Header Int
lev Attr
attr ([Inline] -> Block) -> m [Inline] -> m Block
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [Inline] -> m [Inline]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Inline]
xs
walkBlockM f :: a -> m a
f (Div attr :: Attr
attr bs' :: [Block]
bs')           = Attr -> [Block] -> Block
Div Attr
attr ([Block] -> Block) -> m [Block] -> m Block
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m a) -> [Block] -> m [Block]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Block]
bs'
walkBlockM _ x :: Block
x@CodeBlock {}           = Block -> m Block
forall (m :: * -> *) a. Monad m => a -> m a
return Block
x
walkBlockM _ x :: Block
x@RawBlock {}            = Block -> m Block
forall (m :: * -> *) a. Monad m => a -> m a
return Block
x
walkBlockM _ HorizontalRule           = Block -> m Block
forall (m :: * -> *) a. Monad m => a -> m a
return Block
HorizontalRule
walkBlockM _ Null                     = Block -> m Block
forall (m :: * -> *) a. Monad m => a -> m a
return Block
Null
walkBlockM f :: a -> m a
f (Table capt :: [Inline]
capt as :: [Alignment]
as ws :: [Double]
ws hs :: [[Block]]
hs rs :: [[[Block]]]
rs) = do [Inline]
capt' <- (a -> m a) -> [Inline] -> m [Inline]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Inline]
capt
                                           [[Block]]
hs' <- (a -> m a) -> [[Block]] -> m [[Block]]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [[Block]]
hs
                                           [[[Block]]]
rs' <- (a -> m a) -> [[[Block]]] -> m [[[Block]]]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [[[Block]]]
rs
                                           Block -> m Block
forall (m :: * -> *) a. Monad m => a -> m a
return (Block -> m Block) -> Block -> m Block
forall a b. (a -> b) -> a -> b
$ [Inline]
-> [Alignment] -> [Double] -> [[Block]] -> [[[Block]]] -> Block
Table [Inline]
capt' [Alignment]
as [Double]
ws [[Block]]
hs' [[[Block]]]
rs'

-- | Perform a query on elements nested below a @'Block'@ element by
-- querying all directly nested lists of @Inline@s or @Block@s.
queryBlock :: (Walkable a Citation, Walkable a [Block],
                Walkable a [Inline], Monoid c)
           => (a -> c) -> Block -> c
queryBlock :: (a -> c) -> Block -> c
queryBlock f :: a -> c
f (Para xs :: [Inline]
xs)                = (a -> c) -> [Inline] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Inline]
xs
queryBlock f :: a -> c
f (Plain xs :: [Inline]
xs)               = (a -> c) -> [Inline] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Inline]
xs
queryBlock f :: a -> c
f (LineBlock xs :: [[Inline]]
xs)           = (a -> c) -> [[Inline]] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [[Inline]]
xs
queryBlock _ (CodeBlock _ _)          = c
forall a. Monoid a => a
mempty
queryBlock _ (RawBlock _ _)           = c
forall a. Monoid a => a
mempty
queryBlock f :: a -> c
f (BlockQuote bs :: [Block]
bs)          = (a -> c) -> [Block] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Block]
bs
queryBlock f :: a -> c
f (OrderedList _ cs :: [[Block]]
cs)       = (a -> c) -> [[Block]] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [[Block]]
cs
queryBlock f :: a -> c
f (BulletList cs :: [[Block]]
cs)          = (a -> c) -> [[Block]] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [[Block]]
cs
queryBlock f :: a -> c
f (DefinitionList xs :: [([Inline], [[Block]])]
xs)      = (a -> c) -> [([Inline], [[Block]])] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [([Inline], [[Block]])]
xs
queryBlock f :: a -> c
f (Header _ _ xs :: [Inline]
xs)          = (a -> c) -> [Inline] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Inline]
xs
queryBlock _ HorizontalRule           = c
forall a. Monoid a => a
mempty
queryBlock f :: a -> c
f (Table capt :: [Inline]
capt _ _ hs :: [[Block]]
hs rs :: [[[Block]]]
rs)   = (a -> c) -> [Inline] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Inline]
capt c -> c -> c
forall a. Semigroup a => a -> a -> a
<> (a -> c) -> [[Block]] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [[Block]]
hs c -> c -> c
forall a. Semigroup a => a -> a -> a
<> (a -> c) -> [[[Block]]] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [[[Block]]]
rs
queryBlock f :: a -> c
f (Div _ bs :: [Block]
bs)               = (a -> c) -> [Block] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Block]
bs
queryBlock _ Null                     = c
forall a. Monoid a => a
mempty

-- | Helper method to walk to elements nested below @'MetaValue'@ nodes.
--
-- When walking a meta value with this function, only the contents of the
-- traversed meta value element may change. @MetaBool@ and @MetaString@ will
-- always remain unchanged.
walkMetaValueM :: (Walkable a MetaValue, Walkable a [Block],
                  Walkable a [Inline], Monad f, Applicative f, Functor f)
               => (a -> f a) -> MetaValue -> f MetaValue
walkMetaValueM :: (a -> f a) -> MetaValue -> f MetaValue
walkMetaValueM f :: a -> f a
f (MetaList xs :: [MetaValue]
xs)    = [MetaValue] -> MetaValue
MetaList ([MetaValue] -> MetaValue) -> f [MetaValue] -> f MetaValue
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> f a) -> [MetaValue] -> f [MetaValue]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> f a
f [MetaValue]
xs
walkMetaValueM _ (MetaBool b :: Bool
b)     = MetaValue -> f MetaValue
forall (m :: * -> *) a. Monad m => a -> m a
return (MetaValue -> f MetaValue) -> MetaValue -> f MetaValue
forall a b. (a -> b) -> a -> b
$ Bool -> MetaValue
MetaBool Bool
b
walkMetaValueM _ (MetaString s :: Text
s)   = MetaValue -> f MetaValue
forall (m :: * -> *) a. Monad m => a -> m a
return (MetaValue -> f MetaValue) -> MetaValue -> f MetaValue
forall a b. (a -> b) -> a -> b
$ Text -> MetaValue
MetaString Text
s
walkMetaValueM f :: a -> f a
f (MetaInlines xs :: [Inline]
xs) = [Inline] -> MetaValue
MetaInlines ([Inline] -> MetaValue) -> f [Inline] -> f MetaValue
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> f a) -> [Inline] -> f [Inline]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> f a
f [Inline]
xs
walkMetaValueM f :: a -> f a
f (MetaBlocks bs :: [Block]
bs)  = [Block] -> MetaValue
MetaBlocks ([Block] -> MetaValue) -> f [Block] -> f MetaValue
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> f a) -> [Block] -> f [Block]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> f a
f [Block]
bs
walkMetaValueM f :: a -> f a
f (MetaMap m :: Map Text MetaValue
m)      = Map Text MetaValue -> MetaValue
MetaMap (Map Text MetaValue -> MetaValue)
-> f (Map Text MetaValue) -> f MetaValue
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> f a) -> Map Text MetaValue -> f (Map Text MetaValue)
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> f a
f Map Text MetaValue
m

-- | Perform a query on elements nested below a @'MetaValue'@ element by
-- querying all directly nested lists of @Inline@s, list of @Block@s, or
-- lists or maps of @MetaValue@s.
queryMetaValue :: (Walkable a MetaValue, Walkable a [Block],
                   Walkable a [Inline], Monoid c)
               => (a -> c) -> MetaValue -> c
queryMetaValue :: (a -> c) -> MetaValue -> c
queryMetaValue f :: a -> c
f (MetaList xs :: [MetaValue]
xs)    = (a -> c) -> [MetaValue] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [MetaValue]
xs
queryMetaValue _ (MetaBool _)     = c
forall a. Monoid a => a
mempty
queryMetaValue _ (MetaString _)   = c
forall a. Monoid a => a
mempty
queryMetaValue f :: a -> c
f (MetaInlines xs :: [Inline]
xs) = (a -> c) -> [Inline] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Inline]
xs
queryMetaValue f :: a -> c
f (MetaBlocks bs :: [Block]
bs)  = (a -> c) -> [Block] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Block]
bs
queryMetaValue f :: a -> c
f (MetaMap m :: Map Text MetaValue
m)      = (a -> c) -> Map Text MetaValue -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f Map Text MetaValue
m

-- | Helper method to walk to elements nested below @'Citation'@ nodes.
--
-- The non-inline contents of a citation will remain unchanged during traversal.
-- Only the inline contents, viz. the citation's prefix and postfix, will be
-- traversed further and can thus be changed during this operation.
walkCitationM :: (Walkable a [Inline], Monad m, Applicative m, Functor m)
              => (a -> m a) -> Citation -> m Citation
walkCitationM :: (a -> m a) -> Citation -> m Citation
walkCitationM f :: a -> m a
f (Citation id' :: Text
id' pref :: [Inline]
pref suff :: [Inline]
suff mode :: CitationMode
mode notenum :: Int
notenum hash :: Int
hash) =
    do [Inline]
pref' <- (a -> m a) -> [Inline] -> m [Inline]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Inline]
pref
       [Inline]
suff' <- (a -> m a) -> [Inline] -> m [Inline]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Inline]
suff
       Citation -> m Citation
forall (m :: * -> *) a. Monad m => a -> m a
return (Citation -> m Citation) -> Citation -> m Citation
forall a b. (a -> b) -> a -> b
$ Text
-> [Inline] -> [Inline] -> CitationMode -> Int -> Int -> Citation
Citation Text
id' [Inline]
pref' [Inline]
suff' CitationMode
mode Int
notenum Int
hash

-- | Perform a query on elements nested below a @'Citation'@ element by
-- querying the prefix and postfix @Inline@ lists.
queryCitation :: (Walkable a [Inline], Monoid c)
              => (a -> c) -> Citation -> c
queryCitation :: (a -> c) -> Citation -> c
queryCitation f :: a -> c
f (Citation _ pref :: [Inline]
pref suff :: [Inline]
suff _ _ _) = (a -> c) -> [Inline] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Inline]
pref c -> c -> c
forall a. Semigroup a => a -> a -> a
<> (a -> c) -> [Inline] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Inline]
suff

-- | Helper method to walk the components of a Pandoc element.
walkPandocM :: (Walkable a Meta, Walkable a [Block], Monad m,
                  Applicative m, Functor m)
            => (a -> m a) -> Pandoc -> m Pandoc
walkPandocM :: (a -> m a) -> Pandoc -> m Pandoc
walkPandocM f :: a -> m a
f (Pandoc m :: Meta
m bs :: [Block]
bs) = do Meta
m' <- (a -> m a) -> Meta -> m Meta
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f Meta
m
                                 [Block]
bs' <- (a -> m a) -> [Block] -> m [Block]
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> m a
f [Block]
bs
                                 Pandoc -> m Pandoc
forall (m :: * -> *) a. Monad m => a -> m a
return (Pandoc -> m Pandoc) -> Pandoc -> m Pandoc
forall a b. (a -> b) -> a -> b
$ Meta -> [Block] -> Pandoc
Pandoc Meta
m' [Block]
bs'

-- | Query a pandoc element by recursing first into its @'Meta'@ data
-- and then append the result of recursing into the list of @'Block'@s.
queryPandoc :: (Walkable a Meta, Walkable a [Block], Monoid c)
             => (a -> c) -> Pandoc -> c
queryPandoc :: (a -> c) -> Pandoc -> c
queryPandoc f :: a -> c
f (Pandoc m :: Meta
m bs :: [Block]
bs) = (a -> c) -> Meta -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f Meta
m c -> c -> c
forall a. Semigroup a => a -> a -> a
<> (a -> c) -> [Block] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query a -> c
f [Block]
bs