module Lang.Crucible.Utils.PrettyPrint
  ( commas
  , ppFn
  ) where

import Data.Maybe
import Prettyprinter as PP

ppFn :: String -> [Doc ann] -> Doc ann
ppFn :: forall ann. String -> [Doc ann] -> Doc ann
ppFn String
f [Doc ann]
a = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
f Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens ([Doc ann] -> Doc ann
forall (f :: Type -> Type) ann.
Foldable f =>
f (Doc ann) -> Doc ann
commas [Doc ann]
a)

-- | Print a comma separated list.
commas :: Foldable f => f (Doc ann) -> Doc ann
commas :: forall (f :: Type -> Type) ann.
Foldable f =>
f (Doc ann) -> Doc ann
commas f (Doc ann)
l = Doc ann -> Maybe (Doc ann) -> Doc ann
forall a. a -> Maybe a -> a
fromMaybe Doc ann
forall a. Monoid a => a
mempty (Maybe (Doc ann) -> Doc ann) -> Maybe (Doc ann) -> Doc ann
forall a b. (a -> b) -> a -> b
$ (Maybe (Doc ann) -> Doc ann -> Maybe (Doc ann))
-> Maybe (Doc ann) -> f (Doc ann) -> Maybe (Doc ann)
forall b a. (b -> a -> b) -> b -> f a -> b
forall (t :: Type -> Type) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl Maybe (Doc ann) -> Doc ann -> Maybe (Doc ann)
forall {ann}. Maybe (Doc ann) -> Doc ann -> Maybe (Doc ann)
go Maybe (Doc ann)
forall a. Maybe a
Nothing f (Doc ann)
l
  where go :: Maybe (Doc ann) -> Doc ann -> Maybe (Doc ann)
go Maybe (Doc ann)
Nothing Doc ann
y = Doc ann -> Maybe (Doc ann)
forall a. a -> Maybe a
Just Doc ann
y
        go (Just Doc ann
x) Doc ann
y = Doc ann -> Maybe (Doc ann)
forall a. a -> Maybe a
Just (Doc ann
x Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Char -> Doc ann
forall ann. Char -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Char
',' Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
y)