{-# LANGUAGE FlexibleContexts     #-}
{- |
Copyright   : © 2021 Albert Krewinkel
License     : MIT
Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>

Shared functions used in multiple types.
-}
module Text.Pandoc.Lua.Marshal.Shared
  ( -- * Walking
    walkBlocksAndInlines
  ) where

import Control.Monad ((>=>))
import HsLua (LuaE, LuaError)
import {-# SOURCE #-} Text.Pandoc.Lua.Marshal.Block
  ( walkBlockSplicing, walkBlocksStraight )
import Text.Pandoc.Lua.Marshal.Filter (Filter)
import {-# SOURCE #-} Text.Pandoc.Lua.Marshal.Inline
  ( walkInlineSplicing, walkInlinesStraight )
import Text.Pandoc.Definition
import Text.Pandoc.Lua.Walk (SpliceList, Walkable)

-- | Walk blocks and inlines.
walkBlocksAndInlines :: (LuaError e,
                         Walkable (SpliceList Block) a,
                         Walkable (SpliceList Inline) a,
                         Walkable [Block] a,
                         Walkable [Inline] a)
                     => Filter
                     -> a -> LuaE e a
walkBlocksAndInlines :: Filter -> a -> LuaE e a
walkBlocksAndInlines Filter
f =
      Filter -> a -> LuaE e a
forall e a.
(LuaError e, Walkable (SpliceList Inline) a) =>
Filter -> a -> LuaE e a
walkInlineSplicing Filter
f
  (a -> LuaE e a) -> (a -> LuaE e a) -> a -> LuaE e a
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> Filter -> a -> LuaE e a
forall e a.
(LuaError e, Walkable [Inline] a) =>
Filter -> a -> LuaE e a
walkInlinesStraight Filter
f
  (a -> LuaE e a) -> (a -> LuaE e a) -> a -> LuaE e a
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> Filter -> a -> LuaE e a
forall e a.
(LuaError e, Walkable (SpliceList Block) a) =>
Filter -> a -> LuaE e a
walkBlockSplicing Filter
f
  (a -> LuaE e a) -> (a -> LuaE e a) -> a -> LuaE e a
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> Filter -> a -> LuaE e a
forall e a.
(LuaError e, Walkable [Block] a) =>
Filter -> a -> LuaE e a
walkBlocksStraight Filter
f