{-# LANGUAGE TypeOperators, FlexibleInstances, TypeSynonymInstances,
IncoherentInstances, UndecidableInstances, TemplateHaskell, GADTs #-}
module Data.Comp.Param.Show
(
ShowD(..)
) where
import Data.Comp.Param.Term
import Data.Comp.Param.Ops
import Data.Comp.Param.Derive
import Data.Comp.Param.FreshM
$(derive [liftSum] [''ShowD])
instance (Difunctor f, ShowD f) => ShowD (Cxt h f) where
showD (In t) = showD $ fmap showD t
showD (Hole h) = h
showD (Var p) = return $ show p
instance (Difunctor f, ShowD f) => Show (Term f) where
show = evalFreshM . showD . toCxt . unTerm
instance (ShowD f, Show p) => ShowD (f :&: p) where
showD (x :&: p) = do sx <- showD x
return $ sx ++ " :&: " ++ show p