{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module Data.Comp.Desugar where
import Data.Comp
class (Functor f, Functor g) => Desugar f g where
desugHom :: Hom f g
desugHom = desugHom' . fmap Hole
desugHom' :: Alg f (Context g a)
desugHom' x = appCxt (desugHom x)
instance {-# OVERLAPPABLE #-} (Desugar f h, Desugar g h) => Desugar (f :+: g) h where
desugHom = caseF desugHom desugHom
desugar :: Desugar f g => Term f -> Term g
{-# INLINE desugar #-}
desugar = appHom desugHom
desugarA :: (Functor f', Functor g', DistAnn f p f', DistAnn g p g',
Desugar f g) => Term f' -> Term g'
desugarA = appHom (propAnn desugHom)
instance {-# OVERLAPPABLE #-} (Functor f, Functor g, f :<: g) => Desugar f g where
desugHom = simpCxt . inj