{-|
This defines some utility functions for pretty-printing declarations.
-}
module Data.Macaw.Utils.Pretty
  ( sexpr
  , sexprA
  ) where

import           Prettyprinter

-- | Pretty print an operator name and arguments as an sexpr.
sexpr :: String -> [Doc ann] -> Doc ann
sexpr :: forall ann. String -> [Doc ann] -> Doc ann
sexpr String
nm [Doc ann]
d = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
nm Doc ann -> [Doc ann] -> [Doc ann]
forall a. a -> [a] -> [a]
: [Doc ann]
d))

sexprA :: Applicative m => String -> [m (Doc ann)] -> m (Doc ann)
sexprA :: forall (m :: Type -> Type) ann.
Applicative m =>
String -> [m (Doc ann)] -> m (Doc ann)
sexprA String
nm [m (Doc ann)]
d = String -> [Doc ann] -> Doc ann
forall ann. String -> [Doc ann] -> Doc ann
sexpr String
nm ([Doc ann] -> Doc ann) -> m [Doc ann] -> m (Doc ann)
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> [m (Doc ann)] -> m [Doc ann]
forall (t :: Type -> Type) (f :: Type -> Type) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
forall (f :: Type -> Type) a. Applicative f => [f a] -> f [a]
sequenceA [m (Doc ann)]
d