use Q style
[clean-tests.git] / datatype / Language.hs
1 {-# LANGUAGE MultiParamTypeClasses #-}
2 {-# LANGUAGE FlexibleContexts #-}
3 module Language where
4
5 import Data.Char
6
7 newtype Main a = Main {unmain :: a}
8 data In a b = a :- b
9 infix 1 :-
10
11 class
12 ( Expression v
13 , Function () v
14 , Function (v Int) v, Function (v Bool) v, Function (v Char) v
15 , Function (v Int, v Int) v
16 , Function (v Int, v Int, v Int) v
17 ) => DSL v
18
19 class Expression v where
20 lit :: (Serialise a, Show a) => a -> v a
21 (+.) :: Num a => v a -> v a -> v a
22 (-.) :: Num a => v a -> v a -> v a
23 (/.) :: Fractional a => v a -> v a -> v a
24 (*.) :: Num a => v a -> v a -> v a
25 neg :: Num a => v a -> v a
26 (&.) :: v Bool -> v Bool -> v Bool
27 (|.) :: v Bool -> v Bool -> v Bool
28 not :: v Bool -> v Bool
29 (==.) :: Eq a => v a -> v a -> v Bool
30 (/=.) :: Eq a => v a -> v a -> v Bool
31 (<.) :: Ord a => v a -> v a -> v Bool
32 (>.) :: Ord a => v a -> v a -> v Bool
33 (<=.) :: Ord a => v a -> v a -> v Bool
34 (>=.) :: Ord a => v a -> v a -> v Bool
35 if' :: v Bool -> v a -> v a -> v a
36 bottom :: String -> v a
37
38 class Function a v where
39 fun :: ( (a -> v s) -> In (a -> v s) (Main (v u)) ) -> Main (v u)
40
41 infixr 2 |.
42 infixr 3 &.
43 infix 4 ==., /=., <., >., <=., >=.
44 infixl 6 +., -.
45 infixl 7 *., /.
46
47 class Serialise a where
48 serialise :: a -> Int
49
50 instance Serialise Int where
51 serialise i = i
52 instance Serialise Bool where
53 serialise = fromEnum
54 instance Serialise Char where
55 serialise = ord