packages feed

open-typerep-0.4: examples/Custom.hs

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE UndecidableInstances #-}

-- This file demonstrates how to create one's own type universe

module Custom where



import Control.Monad



import Language.Syntactic

import Data.TypeRep.Representation
import Data.TypeRep.TH



-- Universe of types built using 'Bool', 'Int' and '[]'
data Type sig
  where
    Bool_t :: Type (Full Bool)
    Int_t  :: Type (Full Int)
    List_t :: Type (a :-> Full [a])

instance (Type :<: t) => Typeable t Bool where typeRep' = sugarSym Bool_t
instance (Type :<: t) => Typeable t Int  where typeRep' = sugarSym Int_t

instance (Type :<: t, Typeable t a) => Typeable t [a] where typeRep' = sugarSym List_t typeRep'

deriveRender_forType ''Type
deriveTypeEq ''Type
deriveWitness ''Eq ''Type
derivePWitness ''Eq ''Type
deriveWitness ''Show ''Type
derivePWitness ''Show ''Type
deriveWitnessTypeable ''Type

hlist :: [Dynamic Type]
hlist = [toDyn True, toDyn (1 :: Int), toDyn [1,2,3,4 :: Int]]

main = do
    unless test $ fail "Test failed"
    putStrLn "Test passed"
  where
    test = show hlist == "[True,1,[1,2,3,4]]"