diff --git a/src/Data/Type/Map.hs b/src/Data/Type/Map.hs index 2b03d86..407ea6f 100644 --- a/src/Data/Type/Map.hs +++ b/src/Data/Type/Map.hs @@ -84,7 +84,7 @@ class IsMember v t m where instance {-# OVERLAPS #-} IsMember v t ((v ':-> t) ': m) where lookp _ (Ext _ x _) = x -instance IsMember v t m => IsMember v t (x ': m) where +instance {-# OVERLAPPABLE #-} IsMember v t m => IsMember v t (x ': m) where lookp v (Ext _ _ m) = lookp v m diff --git a/src/Data/Type/Set.hs b/src/Data/Type/Set.hs index f4db7b1..a453b09 100644 --- a/src/Data/Type/Set.hs +++ b/src/Data/Type/Set.hs @@ -6,7 +6,8 @@ module Data.Type.Set (Set(..), Union, Unionable, union, quicksort, append, Sort, Sortable, (:++), Split(..), Cmp, Filter, Flag(..), Nub, Nubable(..), AsSet, asSet, IsSet, Subset(..), - Delete(..), Proxy(..), remove, Remove, (:\)) where + Delete(..), Proxy(..), remove, Remove, (:\), + Member) where import GHC.TypeLits import Data.Type.Bool @@ -15,7 +16,7 @@ import Data.Type.Equality data Proxy (p :: k) = Proxy -- Value-level 'Set' representation, essentially a list -data Set (n :: [*]) where +data Set (n :: [k]) :: * where {--| Construct an empty set -} Empty :: Set '[] {--| Extend a set with an element -} @@ -215,3 +216,14 @@ instance Conder False where {-| Open-family for the ordering operation in the sort -} type family Cmp (a :: k) (b :: k) :: Ordering + +{-| Membership of an element in a set, with an acommanying + value-level function that returns a bool -} +class Member a s where + member :: Proxy a -> Set s -> Bool + +instance {-# OVERLAPS #-} Member a (a ': s) where + member _ (Ext x _) = True + +instance {-# OVERLAPPABLE #-} Member a s => Member a (b ': s) where + member a (Ext _ xs) = member a xs diff --git a/type-level-sets.cabal b/type-level-sets.cabal index 2eea14e..a17764a 100644 --- a/type-level-sets.cabal +++ b/type-level-sets.cabal @@ -1,5 +1,5 @@ name: type-level-sets -version: 0.8.6.0 +version: 0.8.7.0 synopsis: Type-level sets and finite maps (with value-level counterparts) description: This package provides type-level sets (no duplicates, sorted to provide a normal form) via 'Set' and type-level