module Language.Syntactic.Frontend.TupleConstrained
( TupleSat
) where
import Data.Constraint
import Data.Tuple.Curry
import Language.Syntactic
import Language.Syntactic.Constructs.Tuple
class TupleSat (dom :: * -> *) (p :: * -> Constraint) | dom -> p
instance TupleSat (Tuple :|| p) p
instance TupleSat ((Tuple :|| p) :+: dom2) p
instance TupleSat (Select :|| p) p
instance TupleSat ((Select :|| p) :+: dom2) p
instance TupleSat dom p => TupleSat (dom :| q) p
instance TupleSat dom p => TupleSat (dom :|| q) p
instance TupleSat dom2 p => TupleSat (dom1 :+: dom2) p
sugarSymC' :: forall sym dom sig b c p
. ( TupleSat dom p
, p (DenResult sig)
, InjectC (sym :|| p) (AST dom) (DenResult sig)
, ApplySym sig b dom
, SyntacticN c b
)
=> sym sig -> c
sugarSymC' s = sugarSymC (C' s :: (sym :|| p) sig)
instance
( Syntactic a, Domain a ~ dom
, Syntactic b, Domain b ~ dom
, TupleSat dom p
, p (Internal a, Internal b)
, p (Internal a)
, p (Internal b)
, InjectC (Tuple :|| p) dom
( Internal a
, Internal b
)
, InjectC (Select :|| p) dom (Internal a)
, InjectC (Select :|| p) dom (Internal b)
) =>
Syntactic (a,b)
where
type Domain (a,b) = Domain a
type Internal (a,b) =
( Internal a
, Internal b
)
desugar = uncurryN $ sugarSymC' Tup2
sugar a =
( sugarSymC' Sel1 a
, sugarSymC' Sel2 a
)
instance
( Syntactic a, Domain a ~ dom
, Syntactic b, Domain b ~ dom
, Syntactic c, Domain c ~ dom
, TupleSat dom p
, p ( Internal a
, Internal b
, Internal c
)
, p (Internal a)
, p (Internal b)
, p (Internal c)
, InjectC (Tuple :|| p) dom
( Internal a
, Internal b
, Internal c
)
, InjectC (Select :|| p) dom (Internal a)
, InjectC (Select :|| p) dom (Internal b)
, InjectC (Select :|| p) dom (Internal c)
) =>
Syntactic (a,b,c)
where
type Domain (a,b,c) = Domain a
type Internal (a,b,c) =
( Internal a
, Internal b
, Internal c
)
desugar = uncurryN $ sugarSymC' Tup3
sugar a =
( sugarSymC' Sel1 a
, sugarSymC' Sel2 a
, sugarSymC' Sel3 a
)
instance
( Syntactic a, Domain a ~ dom
, Syntactic b, Domain b ~ dom
, Syntactic c, Domain c ~ dom
, Syntactic d, Domain d ~ dom
, TupleSat dom p
, p ( Internal a
, Internal b
, Internal c
, Internal d
)
, p (Internal a)
, p (Internal b)
, p (Internal c)
, p (Internal d)
, InjectC (Tuple :|| p) dom
( Internal a
, Internal b
, Internal c
, Internal d
)
, InjectC (Select :|| p) dom (Internal a)
, InjectC (Select :|| p) dom (Internal b)
, InjectC (Select :|| p) dom (Internal c)
, InjectC (Select :|| p) dom (Internal d)
) =>
Syntactic (a,b,c,d)
where
type Domain (a,b,c,d) = Domain a
type Internal (a,b,c,d) =
( Internal a
, Internal b
, Internal c
, Internal d
)
desugar = uncurryN $ sugarSymC' Tup4
sugar a =
( sugarSymC' Sel1 a
, sugarSymC' Sel2 a
, sugarSymC' Sel3 a
, sugarSymC' Sel4 a
)
instance
( Syntactic a, Domain a ~ dom
, Syntactic b, Domain b ~ dom
, Syntactic c, Domain c ~ dom
, Syntactic d, Domain d ~ dom
, Syntactic e, Domain e ~ dom
, TupleSat dom p
, p ( Internal a
, Internal b
, Internal c
, Internal d
, Internal e
)
, p (Internal a)
, p (Internal b)
, p (Internal c)
, p (Internal d)
, p (Internal e)
, InjectC (Tuple :|| p) dom
( Internal a
, Internal b
, Internal c
, Internal d
, Internal e
)
, InjectC (Select :|| p) dom (Internal a)
, InjectC (Select :|| p) dom (Internal b)
, InjectC (Select :|| p) dom (Internal c)
, InjectC (Select :|| p) dom (Internal d)
, InjectC (Select :|| p) dom (Internal e)
) =>
Syntactic (a,b,c,d,e)
where
type Domain (a,b,c,d,e) = Domain a
type Internal (a,b,c,d,e) =
( Internal a
, Internal b
, Internal c
, Internal d
, Internal e
)
desugar = uncurryN $ sugarSymC' Tup5
sugar a =
( sugarSymC' Sel1 a
, sugarSymC' Sel2 a
, sugarSymC' Sel3 a
, sugarSymC' Sel4 a
, sugarSymC' Sel5 a
)
instance
( Syntactic a, Domain a ~ dom
, Syntactic b, Domain b ~ dom
, Syntactic c, Domain c ~ dom
, Syntactic d, Domain d ~ dom
, Syntactic e, Domain e ~ dom
, Syntactic f, Domain f ~ dom
, TupleSat dom p
, p ( Internal a
, Internal b
, Internal c
, Internal d
, Internal e
, Internal f
)
, p (Internal a)
, p (Internal b)
, p (Internal c)
, p (Internal d)
, p (Internal e)
, p (Internal f)
, InjectC (Tuple :|| p) dom
( Internal a
, Internal b
, Internal c
, Internal d
, Internal e
, Internal f
)
, InjectC (Select :|| p) dom (Internal a)
, InjectC (Select :|| p) dom (Internal b)
, InjectC (Select :|| p) dom (Internal c)
, InjectC (Select :|| p) dom (Internal d)
, InjectC (Select :|| p) dom (Internal e)
, InjectC (Select :|| p) dom (Internal f)
) =>
Syntactic (a,b,c,d,e,f)
where
type Domain (a,b,c,d,e,f) = Domain a
type Internal (a,b,c,d,e,f) =
( Internal a
, Internal b
, Internal c
, Internal d
, Internal e
, Internal f
)
desugar = uncurryN $ sugarSymC' Tup6
sugar a =
( sugarSymC' Sel1 a
, sugarSymC' Sel2 a
, sugarSymC' Sel3 a
, sugarSymC' Sel4 a
, sugarSymC' Sel5 a
, sugarSymC' Sel6 a
)
instance
( Syntactic a, Domain a ~ dom
, Syntactic b, Domain b ~ dom
, Syntactic c, Domain c ~ dom
, Syntactic d, Domain d ~ dom
, Syntactic e, Domain e ~ dom
, Syntactic f, Domain f ~ dom
, Syntactic g, Domain g ~ dom
, TupleSat dom p
, p ( Internal a
, Internal b
, Internal c
, Internal d
, Internal e
, Internal f
, Internal g
)
, p (Internal a)
, p (Internal b)
, p (Internal c)
, p (Internal d)
, p (Internal e)
, p (Internal f)
, p (Internal g)
, InjectC (Tuple :|| p) dom
( Internal a
, Internal b
, Internal c
, Internal d
, Internal e
, Internal f
, Internal g
)
, InjectC (Select :|| p) dom (Internal a)
, InjectC (Select :|| p) dom (Internal b)
, InjectC (Select :|| p) dom (Internal c)
, InjectC (Select :|| p) dom (Internal d)
, InjectC (Select :|| p) dom (Internal e)
, InjectC (Select :|| p) dom (Internal f)
, InjectC (Select :|| p) dom (Internal g)
) =>
Syntactic (a,b,c,d,e,f,g)
where
type Domain (a,b,c,d,e,f,g) = Domain a
type Internal (a,b,c,d,e,f,g) =
( Internal a
, Internal b
, Internal c
, Internal d
, Internal e
, Internal f
, Internal g
)
desugar = uncurryN $ sugarSymC' Tup7
sugar a =
( sugarSymC' Sel1 a
, sugarSymC' Sel2 a
, sugarSymC' Sel3 a
, sugarSymC' Sel4 a
, sugarSymC' Sel5 a
, sugarSymC' Sel6 a
, sugarSymC' Sel7 a
)