packages feed

yoko-0.2: Examples/TermInner.hs

{-# LANGUAGE TypeFamilies, MultiParamTypeClasses, FlexibleInstances,
  UndecidableInstances #-}

{-# OPTIONS_GHC -fcontext-stack=200 #-}

{- |

Module      :  Examples.TermInner
Copyright   :  (c) The University of Kansas 2011
License     :  BSD3

Maintainer  :  nicolas.frisby@gmail.com
Stability   :  experimental
Portability :  see LANGUAGE pragmas (... GHC)

A let-elaboration via "Data.Yoko.InDT".

-}
module Examples.TermInner where

import Examples.TermBase
import Examples.InnerBase (Inner)
import qualified Examples.InnerBase as I
import qualified Examples.TermGeneric as G
import Examples.InnerGeneric ()

import Type.Yoko

import Data.Yoko.InDT
import Data.Yoko.Reflect





elaborate :: Term -> Inner; elaborate = apply (Elab :: Elab IdM Term)

data Elab m t = Elab
type instance Unwrap (Elab m) t = Elab m t
instance Wrapper (Elab m) where wrap = id; unwrap = id

type instance Dom (Elab m) t = Med m t
type instance Rng (Elab m) t = Med m (TApp (Elab m) t)

type instance TApp (Elab m) Term = Inner

instance (IdM ~ m) => Term ::: Domain (Elab m) where
  inhabits = AppBy $ \_ -> dcDispatch $
    eachOrNT (oneF $ RMNTo elab_Let) $ NT $ imageInDTU Elab

elab_Let (G.Let ds tm) =
  foldr (\(Decl ty tm) x -> I.Lam ty x `I.App` elaborate tm) (elaborate tm) ds





ex0 = Let [Decl TInt (Var 111), Decl TBool (Var 222)] (Var 0)

ex1 = elaborate ex0