----------------------------------------------------------------------------
-- |
-- Module : Prettyprinter.Combinators.Basic
-- Copyright : (c) Sergey Vinokurov 2018
-- License : Apache-2.0 (see LICENSE)
-- Maintainer : serg.foo@gmail.com
----------------------------------------------------------------------------
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Prettyprinter.Combinators.Basic
( (##)
, ppListWithDelimSep
) where
import Data.Foldable
import Data.Semigroup as Semigroup
import Prettyprinter as PP
infixr 6 ##
(##) :: Doc ann -> Doc ann -> Doc ann
(##) x y = PP.nest 2 $ x Semigroup.<> PP.line <> y
{-# INLINABLE ppListWithDelimSep #-}
ppListWithDelimSep
:: forall f ann. Foldable f
=> Doc ann
-> Doc ann
-> Doc ann
-> f (Doc ann)
-> Doc ann
ppListWithDelimSep separator left right xs =
case toList xs of
[] -> left <> right
[y] -> PP.flatAlt (left <+> y <+> right) (left <> y <> right)
y:ys ->
PP.align $
PP.group $
PP.flatAlt
(left PP.<+> y <> PP.line' <>
PP.vcat fields <> PP.line <>
right)
(left PP.<> y <> PP.vcat fields <> right)
where
fields :: [Doc ann]
fields = fmap (\x -> separator PP.<+> x) ys