{-# LANGUAGE DataKinds, TypeOperators, TypeFamilies, GADTs, StandaloneDeriving #-}
{-# LANGUAGE FlexibleContexts #-}
import GHC.TypeLits
import Data.Type.Set
type instance Cmp (Natural n) (Natural m) = CmpNat n m
data Natural (a :: Nat) where
Z :: Natural 0
S :: Natural n -> Natural (n + 1)
deriving instance Show (Natural n)
-- foo :: Set '[Natural 0, Natural 1, Natural 3]
foo = asSet $ Ext (S Z) (Ext (S (S (S Z))) (Ext Z Empty))
-- bar :: Set '[Natural 1, Natural 2]
bar = asSet $ Ext (S (S Z)) (Ext (S Z) (Ext (S Z) Empty))
-- foobar :: Set '[Natural 0, Natural 1, Natural 2, Natural 3]
foobar = foo `union` bar
nonMemberTest :: NonMember (Natural 0) as => Set as -> ()
nonMemberTest set = ()
-- nonMemberTest meep is well typed
meep = asSet $ Ext (S Z) (Ext (S (S Z)) Empty)
-- nonMemberTest morp is ill typed
morp = asSet $ Ext (S Z) (Ext (S (S Z)) (Ext Z Empty))