module Text.PrettyPrint.MPPPC.OneDim.Combinators.Align where

import Text.PrettyPrint.MPPPC.OneDim.Combinators.Layout
import Text.PrettyPrint.MPPPC.OneDim.Combinators.Seq
import Text.PrettyPrint.MPPPC.OneDim.Combinators.Tok
import Text.PrettyPrint.MPPPC.OneDim.Pretty
import Text.PrettyPrint.MPPPC.Printable

align :: Pretty s t -> Pretty s t
align d = column $ \ i -> nesting $ \ j -> nest (i - j) d

encloseSep :: Printable s t
           =>  Pretty s t
           ->  Pretty s t
           ->  Pretty s t
           -> [Pretty s t]
           ->  Pretty s t
encloseSep left right seperator ds =
  case ds of
    []  -> left <>      right
    [d] -> left <> d <> right
    _   -> align (cat (zipWith (<>) (left : repeat seperator) ds) <> right)

hang :: Int -> Pretty s t -> Pretty s t
hang n = align . nest n

indent :: Printable s t => Int -> Pretty s t -> Pretty s t
indent i = hang i . (spaces i <>)

list :: Printable s t => [Pretty s t] -> Pretty s t
list = encloseSep bracketLeft bracketRight comma

semiBraces :: Printable s t => [Pretty s t] -> Pretty s t
semiBraces = encloseSep braceLeft braceRight semi

tupled :: Printable s t => [Pretty s t] -> Pretty s t
tupled = encloseSep parenLeft parenRight comma