{-# LANGUAGE FlexibleInstances, FlexibleContexts #-}
module Text.Pandoc.JSON ( module Text.Pandoc.Definition
, ToJSONFilter(..)
)
where
import Text.Pandoc.Definition
import Text.Pandoc.Walk
import Data.Maybe (listToMaybe)
import qualified Data.ByteString.Lazy as BL
import qualified Data.Text as T
import Data.Aeson
import System.Environment (getArgs)
class ToJSONFilter a where
toJSONFilter :: a -> IO ()
instance (Walkable a Pandoc) => ToJSONFilter (a -> a) where
toJSONFilter :: (a -> a) -> IO ()
toJSONFilter a -> a
f = IO ByteString
BL.getContents forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
ByteString -> IO ()
BL.putStr forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ToJSON a => a -> ByteString
encode forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a b. Walkable a b => (a -> a) -> b -> b
walk a -> a
f :: Pandoc -> Pandoc) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall a. HasCallStack => [Char] -> a
error forall a. a -> a
id forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall a. FromJSON a => ByteString -> Either [Char] a
eitherDecode'
instance (Walkable a Pandoc) => ToJSONFilter (a -> IO a) where
toJSONFilter :: (a -> IO a) -> IO ()
toJSONFilter a -> IO a
f = IO ByteString
BL.getContents forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
(forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM a -> IO a
f :: Pandoc -> IO Pandoc) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall a. HasCallStack => [Char] -> a
error forall a. a -> a
id forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. FromJSON a => ByteString -> Either [Char] a
eitherDecode' forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
ByteString -> IO ()
BL.putStr forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ToJSON a => a -> ByteString
encode
instance (Walkable [a] Pandoc) => ToJSONFilter (a -> [a]) where
toJSONFilter :: (a -> [a]) -> IO ()
toJSONFilter a -> [a]
f = IO ByteString
BL.getContents forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
ByteString -> IO ()
BL.putStr forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ToJSON a => a -> ByteString
encode forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a b. Walkable a b => (a -> a) -> b -> b
walk (forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap a -> [a]
f) :: Pandoc -> Pandoc) forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall a. HasCallStack => [Char] -> a
error forall a. a -> a
id forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. FromJSON a => ByteString -> Either [Char] a
eitherDecode'
instance (Walkable [a] Pandoc) => ToJSONFilter (a -> IO [a]) where
toJSONFilter :: (a -> IO [a]) -> IO ()
toJSONFilter a -> IO [a]
f = IO ByteString
BL.getContents forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
(forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
walkM (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM a -> IO [a]
f) :: Pandoc -> IO Pandoc) forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall a. HasCallStack => [Char] -> a
error forall a. a -> a
id forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. FromJSON a => ByteString -> Either [Char] a
eitherDecode' forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
ByteString -> IO ()
BL.putStr forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ToJSON a => a -> ByteString
encode
instance (ToJSONFilter a) => ToJSONFilter ([String] -> a) where
toJSONFilter :: ([[Char]] -> a) -> IO ()
toJSONFilter [[Char]] -> a
f = IO [[Char]]
getArgs forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. ToJSONFilter a => a -> IO ()
toJSONFilter forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[Char]] -> a
f
instance (ToJSONFilter a) => ToJSONFilter (Maybe Format -> a) where
toJSONFilter :: (Maybe Format -> a) -> IO ()
toJSONFilter Maybe Format -> a
f = IO [[Char]]
getArgs forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. ToJSONFilter a => a -> IO ()
toJSONFilter forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe Format -> a
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Text -> Format
Format forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Text
T.pack) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> Maybe a
listToMaybe