{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, UndecidableInstances, TypeOperators #-}
{-# LANGUAGE OverlappingInstances, IncoherentInstances #-}

module FullSession.Incoherent where

import FullSession.Base
import FullSession.TypeEq
import FullSession.Types
import FullSession.TypeAlgebra
import FullSession.Ended
import FullSession.Recursion
import FullSession.SMonad
import FullSession.FullSession
import FullSession.NwSession


instance IsEnded (ss:>Send x y) F
instance IsEnded (ss:>Recv x y) F
instance IsEnded (ss:>Throw x y) F
instance IsEnded (ss:>Catch x y) F
instance IsEnded (ss:>Select x y) F
instance IsEnded (ss:>Offer x y) F
instance IsEnded (ss:>SelectN x y) F
instance IsEnded (ss:>OfferN x y) F
instance IsEnded (ss:>Bot) F
instance IsEnded (ss:>Close) F
instance IsEnded (ss:>Rec n r) F
instance IsEnded (ss:>Var v) F
instance (IsEnded ss b1, IsEndedST s b2, And b1 b2 b) => IsEnded (ss:>s) b

instance And T T T
instance And b F F
instance And F b F