@@ -1,11 +1,11 @@
1{-# LANGUAGE GADTs, DataKinds, KindSignatures, TypeOperators, TypeFamilies,
1{-# LANGUAGE GADTs, DataKinds, KindSignatures, TypeOperators, TypeFamilies,
2 MultiParamTypeClasses, FlexibleInstances, PolyKinds, FlexibleContexts,
2 MultiParamTypeClasses, FlexibleInstances, PolyKinds, FlexibleContexts,
3− UndecidableInstances, ConstraintKinds, OverlappingInstances, ScopedTypeVariables #-}
3+ UndecidableInstances, ConstraintKinds, ScopedTypeVariables #-}
5module Data.Type.Set (Set(..), Union, Unionable, union, quicksort, append,
5module Data.Type.Set (Set(..), Union, Unionable, union, quicksort, append,
6 Sort, Sortable, Append(..), Split(..), Cmp,
6 Sort, Sortable, Append(..), Split(..), Cmp,
7 Nub, Nubable(..), AsSet, asSet, IsSet, Subset(..),
7 Nub, Nubable(..), AsSet, asSet, IsSet, Subset(..),
8− (:->)(..), Var(..)) where
8+ (:->)(..), Var(..), Delete(..)) where
10import GHC.TypeLits
10import GHC.TypeLits
11import Data.Type.Bool
11import Data.Type.Bool
@@ -144,6 +144,15 @@ type family Filter (f :: Flag) (p :: k) (xs :: [k]) :: [k] where
144 Filter FMin p (x ': xs) = If (Cmp x p == LT) (x ': (Filter FMin p xs)) (Filter FMin p xs)
144 Filter FMin p (x ': xs) = If (Cmp x p == LT) (x ': (Filter FMin p xs)) (Filter FMin p xs)
145 Filter FMax p (x ': xs) = If (Cmp x p == GT || Cmp x p == EQ) (x ': (Filter FMax p xs)) (Filter FMax p xs)
145 Filter FMax p (x ': xs) = If (Cmp x p == GT || Cmp x p == EQ) (x ': (Filter FMax p xs)) (Filter FMax p xs)
147+type family DeleteFromList (e :: elem) (list :: [elem]) where
148+ DeleteFromList elem '[] = '[]
149+ DeleteFromList elem (x ': xs) = If (Cmp elem x == EQ)
151+ (x ': DeleteFromList elem xs)
153+type family Delete elem set where
154+ Delete elem (Set xs) = Set (DeleteFromList elem xs)
147{-| Value-level quick sort that respects the type-level ordering -}
156{-| Value-level quick sort that respects the type-level ordering -}
148class Sortable xs where
157class Sortable xs where
149 quicksort :: Set xs -> Set (Sort xs)
158 quicksort :: Set xs -> Set (Sort xs)