{-# LANGUAGE FlexibleContexts #-}

{- | Module for pretty-printing epub spine info

   Used internally by Codec.Epub.Format
-}
module Codec.Epub.Format.Spine
   ( formatSpine
   )
   where

import Control.Monad.Writer.Lazy
import Data.Foldable ( toList )
import Text.Printf

import Codec.Epub.Format.Util
import Codec.Epub.Data.Spine


tellSpineItemref :: MonadWriter (Seq Char) m => SpineItemref -> m ()
tellSpineItemref :: forall (m :: * -> *).
MonadWriter (Seq Char) m =>
SpineItemref -> m ()
tellSpineItemref (SpineItemref MFItemId
idref Maybe Bool
linear) =
   forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq forall a b. (a -> b) -> a -> b
$ forall r. PrintfType r => MFItemId -> r
printf MFItemId
"   idref: %s%s\n" MFItemId
idref (Maybe Bool -> MFItemId
linearToString Maybe Bool
linear)

   where
      boolToYn :: Bool -> MFItemId
boolToYn Bool
True  = MFItemId
"yes"
      boolToYn Bool
False = MFItemId
"no"

      linearToString :: Maybe Bool -> MFItemId
linearToString Maybe Bool
Nothing = MFItemId
""
      linearToString (Just Bool
l) = forall r. PrintfType r => MFItemId -> r
printf MFItemId
", linear: %s" (Bool -> MFItemId
boolToYn Bool
l)


tellSpine :: MonadWriter (Seq Char) m => Spine -> m ()
tellSpine :: forall (m :: * -> *). MonadWriter (Seq Char) m => Spine -> m ()
tellSpine (Spine MFItemId
toc [SpineItemref]
itemRefs) = do
   forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq forall a b. (a -> b) -> a -> b
$ forall r. PrintfType r => MFItemId -> r
printf MFItemId
"spine toc: %s, itemrefs:\n" MFItemId
toc
   forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ forall (m :: * -> *).
MonadWriter (Seq Char) m =>
SpineItemref -> m ()
tellSpineItemref [SpineItemref]
itemRefs


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