module Control.Concurrent.FullSession.Misc where
class TCast a b | a -> b, b->a where typeCast :: a -> b
class TCast' t a b | t a -> b, t b -> a where typeCast' :: t->a->b
class TCast'' t a b | t a -> b, t b -> a where typeCast'' :: t->a->b
instance TCast' () a b => TCast a b where typeCast x = typeCast' () x
instance TCast'' t a b => TCast' t a b where typeCast' = typeCast''
instance TCast'' () a a where typeCast'' _ x = x
data S n
data Z
class Sub n n' n'' | n n' -> n''
instance Sub n n Z
instance Sub (S n) n (S Z)
instance Sub (S (S n)) n (S (S Z))
instance Sub (S (S (S n))) n (S (S (S Z)))
instance Sub (S (S (S (S n)))) n (S (S (S (S Z))))
instance Sub (S (S (S (S (S n))))) n (S (S (S (S (S Z)))))
instance Sub (S (S (S (S (S (S n)))))) n (S (S (S (S (S (S Z))))))
instance Sub (S (S (S (S (S (S (S n))))))) n (S (S (S (S (S (S (S Z)))))))
instance Sub (S (S (S (S (S (S (S (S n)))))))) n (S (S (S (S (S (S (S (S Z))))))))
instance Sub (S (S (S (S (S (S (S (S (S n))))))))) n (S (S (S (S (S (S (S (S (S Z)))))))))
instance Sub (S (S (S (S (S (S (S (S (S (S n)))))))))) n (S (S (S (S (S (S (S (S (S (S Z))))))))))
instance Sub (S (S (S (S (S (S (S (S (S (S (S n))))))))))) n (S (S (S (S (S (S (S (S (S (S (S Z)))))))))))
instance Sub (S (S (S (S (S (S (S (S (S (S (S (S n)))))))))))) n (S (S (S (S (S (S (S (S (S (S (S (S Z))))))))))))
data T
data F
data (:|:) hd tl
infixr 3 :|:
data Nil
class Length ls n | ls -> n
instance Length Nil Z
instance Length ts n => Length (t:|:ts) (S n)
class Update n s t ss tt | n s t ss -> tt
instance (TCast a (s:|:ss), TCast b (t:|:ss)) => Update Z s t a b
instance (TCast a (x:|:ss), TCast b (x:|:tt), Update n s t ss tt) => Update (S n) s t a b