add datatype generation DSL stuff
[clean-tests.git] / datatype / Language.hs
diff --git a/datatype/Language.hs b/datatype/Language.hs
new file mode 100644 (file)
index 0000000..64c5ea8
--- /dev/null
@@ -0,0 +1,37 @@
+{-# LANGUAGE MultiParamTypeClasses #-}
+module Language where
+
+import Serialise
+
+newtype Main a = Main {unmain :: a}
+data In a b = a :- b
+infix 1 :-
+
+class Expression v where
+    lit :: (Serialise a, Show a) => a -> v a
+    (+.) :: Num a => v a -> v a -> v a
+    (-.) :: Num a => v a -> v a -> v a
+    (/.) :: Fractional a => v a -> v a -> v a
+    (*.) :: Num a => v a -> v a -> v a
+    (^.) :: Num a => v a -> v a -> v a
+    neg :: Num a => v a -> v a
+    (&.) :: v Bool -> v Bool -> v Bool
+    (|.) :: v Bool -> v Bool -> v Bool
+    not :: v Bool -> v Bool
+    (==.) :: Eq a => v a -> v a -> v Bool
+    (/=.) :: Eq a => v a -> v a -> v Bool
+    (<.) :: Ord a => v a -> v a -> v Bool
+    (>.) :: Ord a => v a -> v a -> v Bool
+    (<=.) :: Ord a => v a -> v a -> v Bool
+    (>=.) :: Ord a => v a -> v a -> v Bool
+    if' :: v Bool -> v a -> v a -> v a
+
+class Function a v where
+    fun :: ( (a -> v s) -> In (a -> v s) (Main (v u)) ) -> Main (v u)
+
+infixr 2 |.
+infixr 3 &.
+infix 4 ==., /=., <., >., <=., >=.
+infixl 6 +., -.
+infixl 7 *., /.
+infixl 8 ^.