git.iko.soy/type-level-sets
on master help sign in
membership predicate for sets, and generalise sets to arbitrary kind
850dd32Dominic Orchard
src/Data/Type/Map.hs+1−1
@@ -84,7 +84,7 @@ class IsMember v t m where
84instance {-# OVERLAPS #-} IsMember v t ((v ':-> t) ': m) where
84instance {-# OVERLAPS #-} IsMember v t ((v ':-> t) ': m) where
85 lookp _ (Ext _ x _) = x
85 lookp _ (Ext _ x _) = x
86
86
87−instance IsMember v t m => IsMember v t (x ': m) where
87+instance {-# OVERLAPPABLE #-} IsMember v t m => IsMember v t (x ': m) where
88 lookp v (Ext _ _ m) = lookp v m
88 lookp v (Ext _ _ m) = lookp v m
89
89
90
90
src/Data/Type/Set.hs+14−2
@@ -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, (:\),
10+ Member) where
10
11
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
16
17
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 -}
216
217
217type family Cmp (a :: k) (b :: k) :: Ordering
218type family Cmp (a :: k) (b :: k) :: Ordering
219+
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
224+
225+instance {-# OVERLAPS #-} Member a (a ': s) where
226+ member _ (Ext x _) = True
227+
228+instance {-# OVERLAPPABLE #-} Member a s => Member a (b ': s) where
229+ member a (Ext _ xs) = member a xs
type-level-sets.cabal+1−1
@@ -1,5 +1,5 @@
1name: type-level-sets
1name: type-level-sets
2−version: 0.8.6.0
2+version: 0.8.7.0
3synopsis: Type-level sets and finite maps (with value-level counterparts)
3synopsis: Type-level sets and finite maps (with value-level counterparts)
4description:
4description:
5 This package provides type-level sets (no duplicates, sorted to provide a normal form) via 'Set' and type-level
5 This package provides type-level sets (no duplicates, sorted to provide a normal form) via 'Set' and type-level