data-treify-0.3.1: src/CustomTy.hs
{-# LANGUAGE GADTs #-}
{-# OPTIONS_GHC -Wall #-}
----------------------------------------------------------------------
-- |
-- Module : CustomTy
-- Copyright : (c) Conal Elliott 2009
-- License : GPL-3
--
-- Maintainer : conal@conal.net
-- Stability : experimental
--
-- Custom Ty & Typable
----------------------------------------------------------------------
module CustomTy (Ty(..),Typeable,ty, module Data.IsTy) where
import Control.Applicative (liftA2)
-- ty package
import Data.Proof.EQ
import Data.IsTy
-- | Typed type representation. Alternative to Data.Ty in the ty package
data Ty a where
Bool :: Ty Bool
Integer :: Ty Integer
Float :: Ty Float
(:*:) :: Ty a -> Ty b -> Ty (a,b)
(:->:) :: Ty a -> Ty b -> Ty (a -> b)
instance IsTy Ty where
Bool `tyEq` Bool = Just Refl
Integer `tyEq` Integer = Just Refl
Float `tyEq` Float = Just Refl
(a:*:b) `tyEq` (a':*:b') = liftA2 liftEq2 (tyEq a a') (tyEq b b')
(a:->:b) `tyEq` (a':->:b') = liftA2 liftEq2 (tyEq a a') (tyEq b b')
tyEq _ _ = Nothing
-- | Replacement for Typeable and the ty package's ty.
class Typeable a where ty :: Ty a
instance Typeable Bool where ty = Bool
instance Typeable Integer where ty = Integer
instance Typeable Float where ty = Float
instance (Typeable a, Typeable b) => Typeable (a,b) where ty = ty :*: ty
instance (Typeable a, Typeable b) => Typeable (a->b) where ty = ty :->: ty