module Language.PIR.Emit (
Emit(..),
nested, eqSep, commaSep,
) where
import Text.PrettyPrint
class (Show x) => Emit x where
emit :: x -> Doc
instance Eq Doc where
x == y = (render x) == (render y)
instance Emit String where
emit = text
instance (Emit a) => Emit [a] where
emit = vcat . map emit
instance (Emit a) => Emit (Maybe a) where
emit Nothing = empty
emit (Just x) = emit x
instance Emit Doc where
emit = id
instance Emit Int where
emit = int
nested :: (Emit x) => x -> Doc
nested = nest 4 . emit
eqSep :: (Emit a, Emit b, Emit c) => a -> b -> [c] -> Doc
eqSep lhs rhs args = emit lhs <+> equals <+> emit rhs <+> commaSep args
commaSep :: (Emit x) => [x] -> Doc
commaSep = hsep . punctuate comma . map emit