packages feed

compdata-0.5: examples/Examples/Multi/Common.hs

{-# LANGUAGE TemplateHaskell, TypeOperators, MultiParamTypeClasses,
  FlexibleInstances, FlexibleContexts, UndecidableInstances, GADTs #-}
--------------------------------------------------------------------------------
-- |
-- Module      :  Examples.Multi.Common
-- Copyright   :  (c) 2011 Patrick Bahr, Tom Hvitved
-- License     :  BSD3
-- Maintainer  :  Tom Hvitved <hvitved@diku.dk>
-- Stability   :  experimental
-- Portability :  non-portable (GHC Extensions)
--
-- Common example files.
--
--------------------------------------------------------------------------------

module Examples.Multi.Common where

import Data.Comp.Multi
import Data.Comp.Multi.Show ()
import Data.Comp.Multi.Equality ()
import Data.Comp.Multi.Ordering ()
import Data.Comp.Multi.Derive

-- Signature for values and operators
data Value a i where
  Const ::        Int -> Value a Int
  Pair  :: a i -> a j -> Value a (i,j)
data Op a i where
  Add, Mult :: a Int -> a Int   -> Op a Int
  Fst       ::          a (i,j) -> Op a i
  Snd       ::          a (i,j) -> Op a j

-- Signature for the simple expression language
type Sig = Op :+: Value

-- Derive boilerplate code using Template Haskell (GHC 7 needed)
$(derive [makeHFunctor, makeHFoldable, makeHTraversable, makeShowHF, makeEqHF,
          makeOrdHF, smartConstructors, smartAConstructors] 
         [''Value, ''Op])