module Language.Syntactic.Functional.Tuple where
import Language.Syntactic
import Language.Syntactic.Functional
class Select1 tup
where
type Sel1 tup
select1 :: tup -> Sel1 tup
class Select2 tup
where
type Sel2 tup
select2 :: tup -> Sel2 tup
class Select3 tup
where
type Sel3 tup
select3 :: tup -> Sel3 tup
class Select4 tup
where
type Sel4 tup
select4 :: tup -> Sel4 tup
instance Select1 (a,b)
where
type Sel1 (a,b) = a
select1 (a,b) = a
instance Select2 (a,b)
where
type Sel2 (a,b) = b
select2 (a,b) = b
instance Select1 (a,b,c)
where
type Sel1 (a,b,c) = a
select1 (a,b,c) = a
instance Select2 (a,b,c)
where
type Sel2 (a,b,c) = b
select2 (a,b,c) = b
instance Select3 (a,b,c)
where
type Sel3 (a,b,c) = c
select3 (a,b,c) = c
instance Select1 (a,b,c,d)
where
type Sel1 (a,b,c,d) = a
select1 (a,b,c,d) = a
instance Select2 (a,b,c,d)
where
type Sel2 (a,b,c,d) = b
select2 (a,b,c,d) = b
instance Select3 (a,b,c,d)
where
type Sel3 (a,b,c,d) = c
select3 (a,b,c,d) = c
instance Select4 (a,b,c,d)
where
type Sel4 (a,b,c,d) = d
select4 (a,b,c,d) = d
data Tuple sig
where
Tup2 :: Tuple (a :-> b :-> Full (a,b))
Tup3 :: Tuple (a :-> b :-> c :-> Full (a,b,c))
Tup4 :: Tuple (a :-> b :-> c :-> d :-> Full (a,b,c,d))
Sel1 :: Select1 tup => Tuple (tup :-> Full (Sel1 tup))
Sel2 :: Select2 tup => Tuple (tup :-> Full (Sel2 tup))
Sel3 :: Select3 tup => Tuple (tup :-> Full (Sel3 tup))
Sel4 :: Select4 tup => Tuple (tup :-> Full (Sel4 tup))
instance Symbol Tuple
where
symSig Tup2 = signature
symSig Tup3 = signature
symSig Tup4 = signature
symSig Sel1 = signature
symSig Sel2 = signature
symSig Sel3 = signature
symSig Sel4 = signature
instance Render Tuple
where
renderSym Tup2 = "tup2"
renderSym Tup3 = "tup3"
renderSym Tup4 = "tup4"
renderSym Sel1 = "sel1"
renderSym Sel2 = "sel2"
renderSym Sel3 = "sel3"
renderSym Sel4 = "sel4"
renderArgs = renderArgsSmart
instance Equality Tuple
instance StringTree Tuple
instance Eval Tuple
where
evalSym Tup2 = (,)
evalSym Tup3 = (,,)
evalSym Tup4 = (,,,)
evalSym Sel1 = select1
evalSym Sel2 = select2
evalSym Sel3 = select3
evalSym Sel4 = select4
instance EvalEnv Tuple env