{-# LANGUAGE FlexibleInstances #-}
module Text.Layout.Table.StringBuilder where
import Data.Semigroup
class Monoid a => StringBuilder a where
stringB :: String -> a
charB :: Char -> a
replicateCharB :: Int -> Char -> a
replicateCharB i c = stimesMonoid i (charB c)
{-# MINIMAL stringB, charB #-}
spacesB :: StringBuilder a => Int -> a
spacesB k = replicateCharB k ' '
instance StringBuilder String where
stringB = id
charB = (: [])
replicateCharB = replicate
instance StringBuilder (Endo String) where
stringB = diff
charB = Endo . (:)
replicateCharB i c = Endo $ \s -> foldr ($) s $ replicate i (c :)