+dsTest :: DataSource
+dsTest = COMPUTE {
+ dsName = "foo"
+ , dsExpr = Var "foo" :<: Const 100
+-- , dsExpr = Previous
+ }
+
+{-
+data Value
+data Expr r where
+ (:<: ) :: Expr Value -> Expr Value -> Expr Bool
+ (:<=:) :: Expr Value -> Expr Value -> Expr Bool
+ (:>: ) :: Expr Value -> Expr Value -> Expr Bool
+ (:>=:) :: Expr Value -> Expr Value -> Expr Bool
+ (:==:) :: Expr Value -> Expr Value -> Expr Bool
+ (:/=:) :: Expr Value -> Expr Value -> Expr Bool
+ IsUnknown :: Expr Value -> Expr Bool
+ IsInfinity :: Expr Value -> Expr Bool
+ If :: Expr Bool -> Expr a -> Expr a -> Expr a
+ Min :: Expr Value -> Expr Value -> Expr Value
+ Max :: Expr Value -> Expr Value -> Expr Value
+-}
+class Expr a
+class Expr a => CommonExpr a
+class Expr a => IterativeExpr a
+class Expr a => AggregativeExpr a
+instance CommonExpr a => IterativeExpr a
+instance CommonExpr a => AggregativeExpr a
+
+-- Constants and variable names
+data Constant where
+ Const :: !Double -> Constant
+ Var :: !String -> Constant
+instance Expr Constant
+instance CommonExpr Constant
+
+-- Common operators
+data CommonBinaryOp a b where
+ (:<: ) :: !a -> !b -> CommonBinaryOp a b
+ (:<=:) :: !a -> !b -> CommonBinaryOp a b
+instance (Expr a, Expr b) => Expr (CommonBinaryOp a b)
+instance (CommonExpr a, CommonExpr b) => CommonExpr (CommonBinaryOp a b)
+
+-- Iterative special values
+data IterativeValue where
+ Previous :: IterativeValue
+instance Expr IterativeValue
+instance IterativeExpr IterativeValue
+
+-- Aggregative operators
+data AggregativeUnaryOp a where
+ Maximum :: !a -> AggregativeUnaryOp a
+instance Expr a => Expr (AggregativeUnaryOp a)
+instance AggregativeExpr a => AggregativeExpr (AggregativeUnaryOp a)