packages feed

typelevel-rewrite-rules-1.0.0.1: src/TypeLevel/Rewrite/Internal/TypeTerm.hs

{-# LANGUAGE CPP, LambdaCase, ViewPatterns #-}
module TypeLevel.Rewrite.Internal.TypeTerm where

-- GHC API
#if MIN_VERSION_ghc(9,0,0)
import GHC.Plugins (Type, mkTyConApp)
#else
import Type (Type, mkTyConApp)
#endif

-- term-rewriting API
import Data.Rewriting.Term (Term(Fun, Var))

import TypeLevel.Rewrite.Internal.TypeEq
import TypeLevel.Rewrite.Internal.TypeNode


type TypeTerm = Term TypeNode TypeEq

toTypeTerm
  :: Type -> TypeTerm
toTypeTerm (toTypeNodeApp_maybe -> Just (tyNode, args))
  = Fun tyNode (fmap toTypeTerm args)
toTypeTerm tp
  = Var (TypeEq tp)

fromTypeTerm
  :: TypeTerm -> Type
fromTypeTerm = \case
  Var x
    -> unTypeEq x
  Fun (TyCon tyCon) args
    -> mkTyConApp tyCon (fmap fromTypeTerm args)
  Fun (TyLit (TypeEq tyLit)) []
    -> tyLit
  Fun (TyLit _) _
    -> error "impossible: TyLit doesn't have any arguments"