module Text.PrettyPrint.MPPPC.TwoDim.Combinators.Layout where

import Data.List
  ( intersperse )

import Text.PrettyPrint.MPPPC.TwoDim.Combinators.Align
import Text.PrettyPrint.MPPPC.TwoDim.Combinators.Prim
import Text.PrettyPrint.MPPPC.TwoDim.Pretty

(<>) :: Pretty s t -> Pretty s t -> Pretty s t
l <> r = hcat top [l,r]

(<+>) :: Pretty s t -> Pretty s t -> Pretty s t
l <+> r = hcat top [l, empty 0 1, r]

(//) :: Pretty s t -> Pretty s t -> Pretty s t
t // b = vcat left [t,b]

(/+/) :: Pretty s t -> Pretty s t -> Pretty s t
t /+/ b = vcat left [t, empty 1 0, b]

hcat :: Alignment -> [Pretty s t] -> Pretty s t
hcat a bs = Pretty h w (Row $ map (alignVert a h) bs)
  where h = maximum . (0:) . map rows $ bs
        w = sum . map cols $ bs

hsep :: Int -> Alignment -> [Pretty s t] -> Pretty s t
hsep sep a bs = punctuateH a (empty 0 sep) bs

vcat :: Alignment -> [Pretty s t] -> Pretty s t
vcat a bs = Pretty h w (Col $ map (alignHoriz a w) bs)
  where h = sum . map rows $ bs
        w = maximum . (0:) . map cols $ bs

vsep :: Int -> Alignment -> [Pretty s t] -> Pretty s t
vsep sep a = punctuateV a (empty sep 0)

punctuateH :: Alignment -> Pretty s t -> [Pretty s t] -> Pretty s t
punctuateH a p = hcat a . intersperse p

punctuateV :: Alignment -> Pretty s t -> [Pretty s t] -> Pretty s t
punctuateV a p = vcat a . intersperse p