@@ -6,7 +6,8 @@
6module Data.Type.Set (Set(..), Union, Unionable, union, quicksort, append,
6module Data.Type.Set (Set(..), Union, Unionable, union, quicksort, append,
7 Sort, Sortable, (:++), Split(..), Cmp, Filter, Flag(..),
7 Sort, Sortable, (:++), Split(..), Cmp, Filter, Flag(..),
8 Nub, Nubable(..), AsSet, asSet, IsSet, Subset(..),
8 Nub, Nubable(..), AsSet, asSet, IsSet, Subset(..),
9− Delete(..), Proxy(..), remove, Remove, (:\)) where
9+ Delete(..), Proxy(..), remove, Remove, (:\),
11import GHC.TypeLits
12import GHC.TypeLits
12import Data.Type.Bool
13import Data.Type.Bool
@@ -15,7 +16,7 @@ import Data.Type.Equality
15data Proxy (p :: k) = Proxy
16data Proxy (p :: k) = Proxy
17-- Value-level 'Set' representation, essentially a list
18-- Value-level 'Set' representation, essentially a list
18−data Set (n :: [*]) where
19+data Set (n :: [k]) :: * where
19 {--| Construct an empty set -}
20 {--| Construct an empty set -}
20 Empty :: Set '[]
21 Empty :: Set '[]
21 {--| Extend a set with an element -}
22 {--| Extend a set with an element -}
@@ -215,3 +216,14 @@ instance Conder False where
215{-| Open-family for the ordering operation in the sort -}
216{-| Open-family for the ordering operation in the sort -}
217type family Cmp (a :: k) (b :: k) :: Ordering
218type family Cmp (a :: k) (b :: k) :: Ordering
220+{-| Membership of an element in a set, with an acommanying
221+ value-level function that returns a bool -}
222+class Member a s where
223+ member :: Proxy a -> Set s -> Bool
225+instance {-# OVERLAPS #-} Member a (a ': s) where
226+ member _ (Ext x _) = True
228+instance {-# OVERLAPPABLE #-} Member a s => Member a (b ': s) where
229+ member a (Ext _ xs) = member a xs