{-# LANGUAGE TemplateHaskell, MultiParamTypeClasses, FlexibleInstances,
UndecidableInstances, Rank2Types, TypeOperators #-}
module Data.Comp.Param.Desugar where
import Data.Comp.Param
class (Difunctor f, Difunctor g) => Desugar f g where
desugHom :: Hom f g
desugHom = desugHom' . fmap Hole
desugHom' :: f a (Cxt h g a b) -> Cxt h g a b
desugHom' x = appCxt (desugHom x)
instance (Desugar f h, Desugar g h) => Desugar (f :+: g) h where
desugHom = caseD desugHom desugHom
desugar :: Desugar f g => Term f -> Term g
{-# INLINE desugar #-}
desugar (Term t) = Term (appHom desugHom t)
desugarA :: (Difunctor f', Difunctor g', DistAnn f p f', DistAnn g p g',
Desugar f g) => Term f' -> Term g'
desugarA (Term t) = Term (appHom (propAnn desugHom) t)
instance {-# OVERLAPPABLE #-} (Difunctor f, Difunctor g, f :<: g) => Desugar f g where
desugHom = simpCxt . inj