add datatype generation DSL stuff
[clean-tests.git] / datatype / Language.hs
1 {-# LANGUAGE MultiParamTypeClasses #-}
2 module Language where
3
4 import Serialise
5
6 newtype Main a = Main {unmain :: a}
7 data In a b = a :- b
8 infix 1 :-
9
10 class Expression v where
11 lit :: (Serialise a, Show a) => a -> v a
12 (+.) :: Num a => v a -> v a -> v a
13 (-.) :: Num a => v a -> v a -> v a
14 (/.) :: Fractional a => v a -> v a -> v a
15 (*.) :: Num a => v a -> v a -> v a
16 (^.) :: Num a => v a -> v a -> v a
17 neg :: Num a => v a -> v a
18 (&.) :: v Bool -> v Bool -> v Bool
19 (|.) :: v Bool -> v Bool -> v Bool
20 not :: v Bool -> v Bool
21 (==.) :: Eq a => v a -> v a -> v Bool
22 (/=.) :: Eq a => v a -> v a -> v Bool
23 (<.) :: Ord a => v a -> v a -> v Bool
24 (>.) :: Ord a => v a -> v a -> v Bool
25 (<=.) :: Ord a => v a -> v a -> v Bool
26 (>=.) :: Ord a => v a -> v a -> v Bool
27 if' :: v Bool -> v a -> v a -> v a
28
29 class Function a v where
30 fun :: ( (a -> v s) -> In (a -> v s) (Main (v u)) ) -> Main (v u)
31
32 infixr 2 |.
33 infixr 3 &.
34 infix 4 ==., /=., <., >., <=., >=.
35 infixl 6 +., -.
36 infixl 7 *., /.
37 infixl 8 ^.