module Control.Category.Printf.ByteString.Strict
( module Control.Category.Printf
, printf
, printfLn
, hPrintf
, hPrintfLn
, padLeft
, padRight
) where
import Prelude hiding (id, (.))
import Control.Category.Printf
import Control.Comonad
import Data.Monoid
import Data.ByteString (ByteString)
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as BC
import System.IO (Handle)
printf :: Format ByteString (IO ()) b -> b
printf = printfWith B.putStr
printfLn :: Format ByteString (IO ()) b -> b
printfLn = printfWith BC.putStrLn
hPrintf :: Handle -> Format ByteString (IO ()) b -> b
hPrintf h = printfWith (B.hPutStr h)
hPrintfLn :: Handle -> Format ByteString (IO ()) b -> b
hPrintfLn h = printfWith (BC.hPutStrLn h)
padLeft :: ByteString -> Int -> Format ByteString a b -> Format ByteString a b
padLeft s _ f | B.length s < 1 = f
padLeft s n f = (`mapMonoid` f) $ \x ->
let k = B.length x
l = B.length s
(q,r) = (n k) `divMod` l
in mconcat (replicate q s) <> B.take r s <> x
padRight :: ByteString -> Int -> Format ByteString a b -> Format ByteString a b
padRight s _ f | B.length s < 1 = f
padRight s n f = (`mapMonoid` f) $ \x ->
let k = B.length x
l = B.length s
(q,r) = (n k) `divMod` l
in x <> mconcat (replicate q s) <> B.take r s