{-# LANGUAGE FlexibleContexts #-}

{- | Module for pretty-printing epub manifest info

   Used internally by Codec.Epub.Format
-}
module Codec.Epub.Format.Manifest
   ( formatManifest
   )
   where

import Control.Monad.Writer.Lazy ( MonadWriter, execWriter )
import Data.Foldable ( toList )
import Text.Printf ( printf )

import Codec.Epub.Format.Util
import Codec.Epub.Data.Manifest


tellManifestItem :: MonadWriter (Seq Char) m => ManifestItem -> m ()
tellManifestItem :: forall (m :: * -> *).
MonadWriter (Seq Char) m =>
ManifestItem -> m ()
tellManifestItem (ManifestItem MFItemId
mfId MFItemId
href MFItemId
mediaType) =
   MFItemId -> m ()
forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq (MFItemId -> m ()) -> MFItemId -> m ()
forall a b. (a -> b) -> a -> b
$ MFItemId -> MFItemId -> MFItemId -> MFItemId -> MFItemId
forall r. PrintfType r => MFItemId -> r
printf MFItemId
"   id: %s, href: %s, media-type: %s\n"
      MFItemId
mfId MFItemId
href MFItemId
mediaType


tellManifest :: MonadWriter (Seq Char) m => [ManifestItem] -> m ()
tellManifest :: forall (m :: * -> *).
MonadWriter (Seq Char) m =>
[ManifestItem] -> m ()
tellManifest [ManifestItem]
mas = do
   MFItemId -> m ()
forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq MFItemId
"manifest items:\n"
   (ManifestItem -> m ()) -> [ManifestItem] -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ManifestItem -> m ()
forall (m :: * -> *).
MonadWriter (Seq Char) m =>
ManifestItem -> m ()
tellManifestItem [ManifestItem]
mas


{- | Format an epub Manifest structure for pretty printing
-}
formatManifest :: Manifest -> String
formatManifest :: Manifest -> MFItemId
formatManifest (Manifest [ManifestItem]
mis) = Seq Char -> MFItemId
forall a. Seq a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList (Seq Char -> MFItemId)
-> (Writer (Seq Char) () -> Seq Char)
-> Writer (Seq Char) ()
-> MFItemId
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Writer (Seq Char) () -> Seq Char
forall w a. Writer w a -> w
execWriter
   (Writer (Seq Char) () -> MFItemId)
-> Writer (Seq Char) () -> MFItemId
forall a b. (a -> b) -> a -> b
$ [ManifestItem] -> Writer (Seq Char) ()
forall (m :: * -> *).
MonadWriter (Seq Char) m =>
[ManifestItem] -> m ()
tellManifest [ManifestItem]
mis