packages feed

type-sets 0.1.0.0 → 0.1.1.0

raw patch · 5 files changed

+791/−8 lines, 5 filesdep ~cmptypePVP ok

version bump matches the API change (PVP)

Dependency ranges changed: cmptype

API changes (from Hackage documentation)

+ Type.RBSet: E :: TypeSet a
+ Type.RBSet: N :: Color -> TypeSet a -> a -> TypeSet a -> TypeSet a
+ Type.RBSet: class Insertable (k :: ki) (t :: TypeSet ki) where {
+ Type.RBSet: class Removable (k :: ki) (t :: TypeSet ki) where {
+ Type.RBSet: data TypeSet a
+ Type.RBSet: instance GHC.Classes.Eq Type.RBSet.Color
+ Type.RBSet: instance GHC.Classes.Eq a => GHC.Classes.Eq (Type.RBSet.TypeSet a)
+ Type.RBSet: instance GHC.Show.Show Type.RBSet.BalanceAction
+ Type.RBSet: instance GHC.Show.Show Type.RBSet.Color
+ Type.RBSet: instance GHC.Show.Show a => GHC.Show.Show (Type.RBSet.TypeSet a)
+ Type.RBSet: instance Type.RBSet.CanMakeBlack 'Type.RBSet.E
+ Type.RBSet: instance Type.RBSet.Fuseable 'Type.RBSet.E 'Type.RBSet.E
+ Type.RBSet: instance forall a (k :: a) (k' :: a) (ordering :: GHC.Types.Ordering) (color :: Type.RBSet.Color) (left :: Type.RBSet.TypeSet a) (right :: Type.RBSet.TypeSet a). (Type.Compare.CmpType k k' Data.Type.Equality.~ ordering, Type.RBSet.InsertableHelper2 ordering k color left k' right) => Type.RBSet.InsertableHelper1 k ('Type.RBSet.N color left k' right)
+ Type.RBSet: instance forall a (k :: a) (leftz :: Type.RBSet.TypeSet a) (kz :: a) (rightz :: Type.RBSet.TypeSet a) (kx :: a) (right :: Type.RBSet.TypeSet a). Type.RBSet.Delable k ('Type.RBSet.N 'Type.RBSet.R leftz kz rightz) => Type.RBSet.DelableL k ('Type.RBSet.N 'Type.RBSet.R leftz kz rightz) kx right
+ Type.RBSet: instance forall a (k :: a) (leftz :: Type.RBSet.TypeSet a) (kz :: a) (rightz :: Type.RBSet.TypeSet a) (left :: Type.RBSet.TypeSet a) (kx :: a). Type.RBSet.Delable k ('Type.RBSet.N 'Type.RBSet.R leftz kz rightz) => Type.RBSet.DelableR k left kx ('Type.RBSet.N 'Type.RBSet.R leftz kz rightz)
+ Type.RBSet: instance forall a (kx :: a) (k :: a) (ordering :: GHC.Types.Ordering) (left :: Type.RBSet.TypeSet a) (right :: Type.RBSet.TypeSet a) (color :: Type.RBSet.Color). (Type.Compare.CmpType kx k Data.Type.Equality.~ ordering, Type.RBSet.DelableHelper ordering k left kx right) => Type.RBSet.Delable k ('Type.RBSet.N color left kx right)
+ Type.RBSet: instance forall a (left1 :: Type.RBSet.TypeSet a) (k1 :: a) (k2 :: a) (right2 :: Type.RBSet.TypeSet a). Type.RBSet.BalanceableL left1 k1 ('Type.RBSet.N 'Type.RBSet.B 'Type.RBSet.E k2 right2) => Type.RBSet.FuseableHelper2 'Type.RBSet.E ('Type.RBSet.N 'Type.RBSet.B left1 k1 'Type.RBSet.E) ('Type.RBSet.N 'Type.RBSet.B 'Type.RBSet.E k2 right2)
+ Type.RBSet: instance forall a (left1 :: Type.RBSet.TypeSet a) (k1 :: a) (right1 :: Type.RBSet.TypeSet a) (left2 :: Type.RBSet.TypeSet a) (k2 :: a) (right2 :: Type.RBSet.TypeSet a). Type.RBSet.Fuseable ('Type.RBSet.N 'Type.RBSet.B left1 k1 right1) left2 => Type.RBSet.Fuseable ('Type.RBSet.N 'Type.RBSet.B left1 k1 right1) ('Type.RBSet.N 'Type.RBSet.R left2 k2 right2)
+ Type.RBSet: instance forall a (leftz :: Type.RBSet.TypeSet a) (kz :: a) (rightz :: Type.RBSet.TypeSet a) (g :: Type.RBSet.TypeSet a) (k :: a) (deleted :: Type.RBSet.TypeSet a) (kx :: a) (right :: Type.RBSet.TypeSet a). ('Type.RBSet.N 'Type.RBSet.B leftz kz rightz Data.Type.Equality.~ g, Type.RBSet.Delable k g, Type.RBSet.Del k g Data.Type.Equality.~ deleted, Type.RBSet.BalanceableL deleted kx right) => Type.RBSet.DelableL k ('Type.RBSet.N 'Type.RBSet.B leftz kz rightz) kx right
+ Type.RBSet: instance forall a (leftz :: Type.RBSet.TypeSet a) (kz :: a) (rightz :: Type.RBSet.TypeSet a) (g :: Type.RBSet.TypeSet a) (k :: a) (deleted :: Type.RBSet.TypeSet a) (left :: Type.RBSet.TypeSet a) (kx :: a). ('Type.RBSet.N 'Type.RBSet.B leftz kz rightz Data.Type.Equality.~ g, Type.RBSet.Delable k g, Type.RBSet.Del k g Data.Type.Equality.~ deleted, Type.RBSet.BalanceableR left kx deleted) => Type.RBSet.DelableR k left kx ('Type.RBSet.N 'Type.RBSet.B leftz kz rightz)
+ Type.RBSet: instance forall a (right1 :: Type.RBSet.TypeSet a) (left2 :: Type.RBSet.TypeSet a) (fused :: Type.RBSet.TypeSet a) (left1 :: Type.RBSet.TypeSet a) (k1 :: a) (k2 :: a) (right2 :: Type.RBSet.TypeSet a). (Type.RBSet.Fuseable right1 left2, Type.RBSet.Fuse right1 left2 Data.Type.Equality.~ fused, Type.RBSet.FuseableHelper1 fused ('Type.RBSet.N 'Type.RBSet.R left1 k1 right1) ('Type.RBSet.N 'Type.RBSet.R left2 k2 right2)) => Type.RBSet.Fuseable ('Type.RBSet.N 'Type.RBSet.R left1 k1 right1) ('Type.RBSet.N 'Type.RBSet.R left2 k2 right2)
+ Type.RBSet: instance forall a (right1 :: Type.RBSet.TypeSet a) (left2 :: Type.RBSet.TypeSet a) (fused :: Type.RBSet.TypeSet a) (left1 :: Type.RBSet.TypeSet a) (k1 :: a) (k2 :: a) (right2 :: Type.RBSet.TypeSet a). (Type.RBSet.Fuseable right1 left2, Type.RBSet.Fuse right1 left2 Data.Type.Equality.~ fused, Type.RBSet.FuseableHelper2 fused ('Type.RBSet.N 'Type.RBSet.B left1 k1 right1) ('Type.RBSet.N 'Type.RBSet.B left2 k2 right2)) => Type.RBSet.Fuseable ('Type.RBSet.N 'Type.RBSet.B left1 k1 right1) ('Type.RBSet.N 'Type.RBSet.B left2 k2 right2)
+ Type.RBSet: instance forall a (right1 :: Type.RBSet.TypeSet a) (left2 :: Type.RBSet.TypeSet a) (k2 :: a) (right2 :: Type.RBSet.TypeSet a) (left1 :: Type.RBSet.TypeSet a) (k1 :: a). Type.RBSet.Fuseable right1 ('Type.RBSet.N 'Type.RBSet.B left2 k2 right2) => Type.RBSet.Fuseable ('Type.RBSet.N 'Type.RBSet.R left1 k1 right1) ('Type.RBSet.N 'Type.RBSet.B left2 k2 right2)
+ Type.RBSet: instance forall a (right1 :: Type.RBSet.TypeSet a) (left2 :: Type.RBSet.TypeSet a) (s1 :: Type.RBSet.TypeSet a) (z :: a) (s2 :: Type.RBSet.TypeSet a) (left1 :: Type.RBSet.TypeSet a) (k1 :: a) (k2 :: a) (right2 :: Type.RBSet.TypeSet a). (Type.RBSet.Fuseable right1 left2, Type.RBSet.Fuse right1 left2 Data.Type.Equality.~ 'Type.RBSet.N 'Type.RBSet.B s1 z s2) => Type.RBSet.FuseableHelper1 ('Type.RBSet.N 'Type.RBSet.B s1 z s2) ('Type.RBSet.N 'Type.RBSet.R left1 k1 right1) ('Type.RBSet.N 'Type.RBSet.R left2 k2 right2)
+ Type.RBSet: instance forall a (right1 :: Type.RBSet.TypeSet a) (left2 :: Type.RBSet.TypeSet a) (s1 :: Type.RBSet.TypeSet a) (z :: a) (s2 :: Type.RBSet.TypeSet a) (left1 :: Type.RBSet.TypeSet a) (k1 :: a) (k2 :: a) (right2 :: Type.RBSet.TypeSet a). (Type.RBSet.Fuseable right1 left2, Type.RBSet.Fuse right1 left2 Data.Type.Equality.~ 'Type.RBSet.N 'Type.RBSet.B s1 z s2, Type.RBSet.BalanceableL left1 k1 ('Type.RBSet.N 'Type.RBSet.B ('Type.RBSet.N 'Type.RBSet.B s1 z s2) k2 right2)) => Type.RBSet.FuseableHelper2 ('Type.RBSet.N 'Type.RBSet.B s1 z s2) ('Type.RBSet.N 'Type.RBSet.B left1 k1 right1) ('Type.RBSet.N 'Type.RBSet.B left2 k2 right2)
+ Type.RBSet: instance forall a (right1 :: Type.RBSet.TypeSet a) (left2 :: Type.RBSet.TypeSet a) (s1 :: Type.RBSet.TypeSet a) (z :: a) (s2 :: Type.RBSet.TypeSet a) (left1 :: Type.RBSet.TypeSet a) (k1 :: a) (k2 :: a) (right2 :: Type.RBSet.TypeSet a). (Type.RBSet.Fuseable right1 left2, Type.RBSet.Fuse right1 left2 Data.Type.Equality.~ 'Type.RBSet.N 'Type.RBSet.R s1 z s2) => Type.RBSet.FuseableHelper1 ('Type.RBSet.N 'Type.RBSet.R s1 z s2) ('Type.RBSet.N 'Type.RBSet.R left1 k1 right1) ('Type.RBSet.N 'Type.RBSet.R left2 k2 right2)
+ Type.RBSet: instance forall a (right1 :: Type.RBSet.TypeSet a) (left2 :: Type.RBSet.TypeSet a) (s1 :: Type.RBSet.TypeSet a) (z :: a) (s2 :: Type.RBSet.TypeSet a) (left1 :: Type.RBSet.TypeSet a) (k1 :: a) (k2 :: a) (right2 :: Type.RBSet.TypeSet a). (Type.RBSet.Fuseable right1 left2, Type.RBSet.Fuse right1 left2 Data.Type.Equality.~ 'Type.RBSet.N 'Type.RBSet.R s1 z s2) => Type.RBSet.FuseableHelper2 ('Type.RBSet.N 'Type.RBSet.R s1 z s2) ('Type.RBSet.N 'Type.RBSet.B left1 k1 right1) ('Type.RBSet.N 'Type.RBSet.B left2 k2 right2)
+ Type.RBSet: instance forall a (t2 :: Type.RBSet.TypeSet a) (z :: a) (t3 :: Type.RBSet.TypeSet a) (g :: Type.RBSet.TypeSet a) (t1 :: Type.RBSet.TypeSet a) (y :: a). ('Type.RBSet.N 'Type.RBSet.R t2 z t3 Data.Type.Equality.~ g, Type.RBSet.BalanceableHelper (Type.RBSet.ShouldBalance t1 g) t1 y g) => Type.RBSet.BalanceableHelperL 'GHC.Types.True t1 y ('Type.RBSet.N 'Type.RBSet.B t2 z t3)
+ Type.RBSet: instance forall ki (a :: Type.RBSet.TypeSet ki) (k :: ki) (b :: Type.RBSet.TypeSet ki). Type.RBSet.BalanceableHelper 'Type.RBSet.DoNotBalance a k b
+ Type.RBSet: instance forall ki (a :: Type.RBSet.TypeSet ki) (k1 :: ki) (b :: Type.RBSet.TypeSet ki) (k2 :: ki) (c :: Type.RBSet.TypeSet ki) (k3 :: ki) (d :: Type.RBSet.TypeSet ki). Type.RBSet.BalanceableHelper 'Type.RBSet.BalanceLL ('Type.RBSet.N 'Type.RBSet.R ('Type.RBSet.N 'Type.RBSet.R a k1 b) k2 c) k3 d
+ Type.RBSet: instance forall ki (a :: Type.RBSet.TypeSet ki) (k1 :: ki) (b :: Type.RBSet.TypeSet ki) (k2 :: ki) (c :: Type.RBSet.TypeSet ki) (k3 :: ki) (d :: Type.RBSet.TypeSet ki). Type.RBSet.BalanceableHelper 'Type.RBSet.BalanceLR ('Type.RBSet.N 'Type.RBSet.R a k1 ('Type.RBSet.N 'Type.RBSet.R b k2 c)) k3 d
+ Type.RBSet: instance forall ki (a :: Type.RBSet.TypeSet ki) (k1 :: ki) (b :: Type.RBSet.TypeSet ki) (k2 :: ki) (c :: Type.RBSet.TypeSet ki) (k3 :: ki) (d :: Type.RBSet.TypeSet ki). Type.RBSet.BalanceableHelper 'Type.RBSet.BalanceRL a k1 ('Type.RBSet.N 'Type.RBSet.R ('Type.RBSet.N 'Type.RBSet.R b k2 c) k3 d)
+ Type.RBSet: instance forall ki (a :: Type.RBSet.TypeSet ki) (k1 :: ki) (b :: Type.RBSet.TypeSet ki) (k2 :: ki) (c :: Type.RBSet.TypeSet ki) (k3 :: ki) (d :: Type.RBSet.TypeSet ki). Type.RBSet.BalanceableHelper 'Type.RBSet.BalanceRR a k1 ('Type.RBSet.N 'Type.RBSet.R b k2 ('Type.RBSet.N 'Type.RBSet.R c k3 d))
+ Type.RBSet: instance forall ki (color :: Type.RBSet.Color) (left :: Type.RBSet.TypeSet ki) (k :: ki) (right :: Type.RBSet.TypeSet ki). Type.RBSet.CanMakeBlack ('Type.RBSet.N color left k right)
+ Type.RBSet: instance forall ki (color :: Type.RBSet.Color) (left :: Type.RBSet.TypeSet ki) (k :: ki) (right :: Type.RBSet.TypeSet ki). Type.RBSet.Fuseable 'Type.RBSet.E ('Type.RBSet.N color left k right)
+ Type.RBSet: instance forall ki (color :: Type.RBSet.Color) (left :: Type.RBSet.TypeSet ki) (k :: ki) (right :: Type.RBSet.TypeSet ki). Type.RBSet.Fuseable ('Type.RBSet.N color left k right) 'Type.RBSet.E
+ Type.RBSet: instance forall ki (k :: ki) (color :: Type.RBSet.Color) (left :: Type.RBSet.TypeSet ki) (right :: Type.RBSet.TypeSet ki). Type.RBSet.InsertableHelper2 'GHC.Types.EQ k color left k right
+ Type.RBSet: instance forall ki (k :: ki) (kx :: ki) (right :: Type.RBSet.TypeSet ki). Type.RBSet.DelableL k 'Type.RBSet.E kx right
+ Type.RBSet: instance forall ki (k :: ki) (left :: Type.RBSet.TypeSet ki) (inserted :: Type.RBSet.TypeSet ki) (k' :: ki) (right :: Type.RBSet.TypeSet ki). (Type.RBSet.InsertableHelper1 k left, Type.RBSet.Insert1 k left Data.Type.Equality.~ inserted, Type.RBSet.Balanceable inserted k' right) => Type.RBSet.InsertableHelper2 'GHC.Types.LT k 'Type.RBSet.B left k' right
+ Type.RBSet: instance forall ki (k :: ki) (left :: Type.RBSet.TypeSet ki) (inserted :: Type.RBSet.TypeSet ki) (k' :: ki) (right :: Type.RBSet.TypeSet ki). (Type.RBSet.InsertableHelper1 k left, Type.RBSet.Insert1 k left Data.Type.Equality.~ inserted, Type.RBSet.Balanceable inserted k' right) => Type.RBSet.InsertableHelper2 'GHC.Types.LT k 'Type.RBSet.R left k' right
+ Type.RBSet: instance forall ki (k :: ki) (left :: Type.RBSet.TypeSet ki) (kx :: ki) (right :: Type.RBSet.TypeSet ki). Type.RBSet.DelableL k left kx right => Type.RBSet.DelableHelper 'GHC.Types.GT k left kx right
+ Type.RBSet: instance forall ki (k :: ki) (left :: Type.RBSet.TypeSet ki) (kx :: ki) (right :: Type.RBSet.TypeSet ki). Type.RBSet.DelableR k left kx right => Type.RBSet.DelableHelper 'GHC.Types.LT k left kx right
+ Type.RBSet: instance forall ki (k :: ki) (left :: Type.RBSet.TypeSet ki) (kx :: ki). Type.RBSet.DelableR k left kx 'Type.RBSet.E
+ Type.RBSet: instance forall ki (k :: ki) (right :: Type.RBSet.TypeSet ki) (inserted :: Type.RBSet.TypeSet ki) (left :: Type.RBSet.TypeSet ki) (k' :: ki). (Type.RBSet.InsertableHelper1 k right, Type.RBSet.Insert1 k right Data.Type.Equality.~ inserted, Type.RBSet.Balanceable left k' inserted) => Type.RBSet.InsertableHelper2 'GHC.Types.GT k 'Type.RBSet.B left k' right
+ Type.RBSet: instance forall ki (k :: ki) (right :: Type.RBSet.TypeSet ki) (inserted :: Type.RBSet.TypeSet ki) (left :: Type.RBSet.TypeSet ki) (k' :: ki). (Type.RBSet.InsertableHelper1 k right, Type.RBSet.Insert1 k right Data.Type.Equality.~ inserted, Type.RBSet.Balanceable left k' inserted) => Type.RBSet.InsertableHelper2 'GHC.Types.GT k 'Type.RBSet.R left k' right
+ Type.RBSet: instance forall ki (k :: ki) (t :: Type.RBSet.TypeSet ki) (deleted :: Type.RBSet.TypeSet ki). (Type.RBSet.Delable k t, Type.RBSet.Del k t Data.Type.Equality.~ deleted, Type.RBSet.CanMakeBlack deleted) => Type.RBSet.Removable k t
+ Type.RBSet: instance forall ki (k :: ki) (t :: Type.RBSet.TypeSet ki) (inserted :: Type.RBSet.TypeSet ki). (Type.RBSet.InsertableHelper1 k t, Type.RBSet.Insert1 k t Data.Type.Equality.~ inserted, Type.RBSet.CanMakeBlack inserted) => Type.RBSet.Insertable k t
+ Type.RBSet: instance forall ki (k :: ki). Type.RBSet.Delable k 'Type.RBSet.E
+ Type.RBSet: instance forall ki (k :: ki). Type.RBSet.InsertableHelper1 k 'Type.RBSet.E
+ Type.RBSet: instance forall ki (l :: Type.RBSet.TypeSet ki) (k :: ki) (r :: Type.RBSet.TypeSet ki) (g :: Type.RBSet.TypeSet ki) (t3 :: Type.RBSet.TypeSet ki) (z :: ki) (t1 :: Type.RBSet.TypeSet ki) (y :: ki) (t2 :: Type.RBSet.TypeSet ki) (u :: ki). ('Type.RBSet.N 'Type.RBSet.R l k r Data.Type.Equality.~ g, Type.RBSet.BalanceableHelper (Type.RBSet.ShouldBalance t3 g) t3 z g) => Type.RBSet.BalanceableHelperL 'GHC.Types.True t1 y ('Type.RBSet.N 'Type.RBSet.R ('Type.RBSet.N 'Type.RBSet.B t2 u t3) z ('Type.RBSet.N 'Type.RBSet.B l k r))
+ Type.RBSet: instance forall ki (l :: Type.RBSet.TypeSet ki) (r :: Type.RBSet.TypeSet ki) (b :: GHC.Types.Bool) (k :: ki). (Type.RBSet.DiscriminateBalL l r Data.Type.Equality.~ b, Type.RBSet.BalanceableHelperL b l k r) => Type.RBSet.BalanceableL l k r
+ Type.RBSet: instance forall ki (l :: Type.RBSet.TypeSet ki) (r :: Type.RBSet.TypeSet ki) (b :: GHC.Types.Bool) (k :: ki). (Type.RBSet.DiscriminateBalR l r Data.Type.Equality.~ b, Type.RBSet.BalanceableHelperR b l k r) => Type.RBSet.BalanceableR l k r
+ Type.RBSet: instance forall ki (left :: Type.RBSet.TypeSet ki) (right :: Type.RBSet.TypeSet ki) (action :: Type.RBSet.BalanceAction) (k :: ki). (Type.RBSet.ShouldBalance left right Data.Type.Equality.~ action, Type.RBSet.BalanceableHelper action left k right) => Type.RBSet.Balanceable left k right
+ Type.RBSet: instance forall ki (left :: Type.RBSet.TypeSet ki) (right :: Type.RBSet.TypeSet ki) (k :: ki). Type.RBSet.Fuseable left right => Type.RBSet.DelableHelper 'GHC.Types.EQ k left k right
+ Type.RBSet: instance forall ki (left1 :: Type.RBSet.TypeSet ki) (k1 :: ki) (k2 :: ki) (right2 :: Type.RBSet.TypeSet ki). Type.RBSet.FuseableHelper1 'Type.RBSet.E ('Type.RBSet.N 'Type.RBSet.R left1 k1 'Type.RBSet.E) ('Type.RBSet.N 'Type.RBSet.R 'Type.RBSet.E k2 right2)
+ Type.RBSet: instance forall ki (left1 :: Type.RBSet.TypeSet ki) (k1 :: ki) (right1 :: Type.RBSet.TypeSet ki) (k2 :: ki) (right2 :: Type.RBSet.TypeSet ki). Type.RBSet.BalanceableHelperL 'GHC.Types.False ('Type.RBSet.N 'Type.RBSet.R left1 k1 right1) k2 right2
+ Type.RBSet: instance forall ki (left1 :: Type.RBSet.TypeSet ki) (k1 :: ki) (right1 :: Type.RBSet.TypeSet ki) (kx :: ki) (left2 :: Type.RBSet.TypeSet ki) (k2 :: ki) (right2 :: Type.RBSet.TypeSet ki). Type.RBSet.BalanceableHelper 'Type.RBSet.BalanceSpecial ('Type.RBSet.N 'Type.RBSet.R left1 k1 right1) kx ('Type.RBSet.N 'Type.RBSet.R left2 k2 right2)
+ Type.RBSet: instance forall ki (right2 :: Type.RBSet.TypeSet ki) (k2 :: ki) (left1 :: Type.RBSet.TypeSet ki) (k1 :: ki) (right1 :: Type.RBSet.TypeSet ki). Type.RBSet.BalanceableHelperR 'GHC.Types.False right2 k2 ('Type.RBSet.N 'Type.RBSet.R left1 k1 right1)
+ Type.RBSet: instance forall ki (t2 :: Type.RBSet.TypeSet ki) (u :: ki) (t3 :: Type.RBSet.TypeSet ki) (g :: Type.RBSet.TypeSet ki) (l :: Type.RBSet.TypeSet ki) (shouldbalance :: Type.RBSet.BalanceAction) (z :: ki) (k :: ki) (r :: Type.RBSet.TypeSet ki) (y :: ki) (t1 :: Type.RBSet.TypeSet ki). ('Type.RBSet.N 'Type.RBSet.R t2 u t3 Data.Type.Equality.~ g, Type.RBSet.ShouldBalance g l Data.Type.Equality.~ shouldbalance, Type.RBSet.BalanceableHelper shouldbalance g z l) => Type.RBSet.BalanceableHelperR 'GHC.Types.True ('Type.RBSet.N 'Type.RBSet.R ('Type.RBSet.N 'Type.RBSet.B t2 u t3) z ('Type.RBSet.N 'Type.RBSet.B l k r)) y t1
+ Type.RBSet: instance forall ki (t2 :: Type.RBSet.TypeSet ki) (z :: ki) (t3 :: Type.RBSet.TypeSet ki) (g :: Type.RBSet.TypeSet ki) (t1 :: Type.RBSet.TypeSet ki) (shouldbalance :: Type.RBSet.BalanceAction) (y :: ki). ('Type.RBSet.N 'Type.RBSet.R t2 z t3 Data.Type.Equality.~ g, Type.RBSet.ShouldBalance g t1 Data.Type.Equality.~ shouldbalance, Type.RBSet.BalanceableHelper shouldbalance g y t1) => Type.RBSet.BalanceableHelperR 'GHC.Types.True ('Type.RBSet.N 'Type.RBSet.B t2 z t3) y t1
+ Type.RBSet: type Empty = E
+ Type.RBSet: type FromList (es :: [k]) = InsertAll es Empty
+ Type.RBSet: type family Merge (small :: TypeSet k) (big :: TypeSet k) :: TypeSet k
+ Type.RBSet: }

Files

ChangeLog.md view
@@ -1,7 +1,11 @@ # Changelog for type-sets +## 0.1.1.0 --- 2019-08-11++- Added `Type.RBSet` for a red-black-tree-backed set (thanks to @danidiaz)+ ## 0.1.0.0 --- 2019-08-07 -Initial release!+- Initial release!  ## Unreleased changes
README.md view
@@ -1,7 +1,7 @@ # type-sets  [![Build Status](https://api.travis-ci.org/isovector/type-sets.svg?branch=master)](https://travis-ci.org/isovector/type-sets)-[![Hackage](https://img.shields.io/hackage/v/cmptype.svg?logo=haskell&label=cmptype)](https://hackage.haskell.org/package/cmptype)+[![Hackage](https://img.shields.io/hackage/v/type-sets.svg?logo=haskell&label=type-sets)](https://hackage.haskell.org/package/type-sets)   ## Dedication@@ -31,7 +31,7 @@ test1 = id  -- Bool is a member :)  test2 :: Proxy (Member Char MySet) -> Proxy 'False-test2 = id  -- False is not a member :(+test2 = id  -- Char is not a member :( ```  See the `Type.Set` module for more operations.
+ src/Type/RBSet.hs view
@@ -0,0 +1,583 @@+{-# LANGUAGE DataKinds             #-}+{-# LANGUAGE PolyKinds             #-}+{-# LANGUAGE TypeFamilies          #-}+{-# LANGUAGE TypeOperators         #-}+{-# LANGUAGE UndecidableInstances  #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances     #-}++-- | See <https://www.cs.kent.ac.uk/people/staff/smk/redblack/rb.html here> for+-- the original term-level code by Stefan Kahrs.+--+-- @since 0.1.1.0+module Type.RBSet+  ( -- * Core type+    TypeSet (..)+  , Empty+    -- * Set operations+  , Member+  , Insertable(Insert)+  , InsertAll+  , FromList+  , Removable(Remove)+  , Merge+  ) where++import Type.Compare+import GHC.TypeLits++-- | The color of a node.+data Color = R+           | B+    deriving (Show,Eq)++-- | A Red-Black tree.+--+-- @since 0.1.1.0+data TypeSet a = E+               | N Color (TypeSet a) a (TypeSet a)+    deriving (Show,Eq)++-- | A map without entries.+type Empty = E++--+--+-- Insertion++{- | Insert a list of type level key / value pairs into a type-level map.+-}+type family InsertAll (es :: [k]) (t :: TypeSet k) :: TypeSet k where+    InsertAll '[] t = t+    InsertAll ( v ': es ) t = Insert v (InsertAll es t)++{- | Build a type-level map out of a list of type level key / value pairs.+-}+type FromList (es :: [k]) = InsertAll es Empty++{- | The associated type family 'Insert' produces the resulting map.++ -}+class Insertable (k :: ki) (t :: TypeSet ki) where+    type Insert k t :: TypeSet ki++-- insert x s =+--  T B a z b+--  where+--  T _ a z b = ins s+instance (InsertableHelper1 k t, Insert1 k t ~ inserted, CanMakeBlack inserted) => Insertable k t where+    type Insert k t = MakeBlack (Insert1 k t)++class CanMakeBlack (t :: TypeSet ki) where+    type MakeBlack t :: TypeSet ki++instance CanMakeBlack (N color left k right) where+    type MakeBlack (N color left k right) = N B left k right++instance CanMakeBlack E where+    type MakeBlack E = E++class InsertableHelper1 (k :: ki)+                        (t :: TypeSet ki) where+    type Insert1 k t :: TypeSet ki++instance InsertableHelper1 k E where+    type Insert1 k E = N R E k E++instance (CmpType k k' ~ ordering,+          InsertableHelper2 ordering k color left k' right+         )+         => InsertableHelper1 k (N color left k' right) where+    -- FIXME possible duplicate work with CmpType: both in constraint and in associated type family.+    -- Is that bad? How to avoid it?+    type Insert1 k (N color left k' right) = Insert2 (CmpType k k') k color left k' right++class InsertableHelper2 (ordering :: Ordering)+                        (k :: ki)+                        (color :: Color)+                        (left :: TypeSet ki)+                        (k' :: ki)+                        (right :: TypeSet ki) where+    type Insert2 ordering k color left k' right :: TypeSet ki++--  ins s@(T B a y b)+--      | x<y = balance (ins a) y b+instance (InsertableHelper1 k left, Insert1 k left ~ inserted,+          Balanceable inserted k' right+         )+         => InsertableHelper2 LT k B left k' right where+    type Insert2              LT k B left k' right = Balance (Insert1 k left) k' right++--  ins s@(T B a y b)+--      | x<y = balance (ins a) y b+instance (InsertableHelper1 k left, Insert1 k left ~ inserted,+          Balanceable inserted k' right+         )+         => InsertableHelper2 LT k R left k' right where+    type Insert2              LT k R left k' right = N R (Insert1 k left) k' right+++instance InsertableHelper2 EQ k color left k right where+    type Insert2           EQ k color left k right = N color left k right++--  ins s@(T B a y b)+--      | ...+--      | x>y = balance a y (ins b)+instance (InsertableHelper1 k right, Insert1 k right ~ inserted,+          Balanceable left  k' inserted+         )+         => InsertableHelper2 GT k B left k' right where+    type Insert2              GT k B left k' right = Balance left  k' (Insert1 k right)++--  ins s@(T R a y b)+--      | ...+--      | x>y = T R a y (ins b)+instance (InsertableHelper1 k right, Insert1 k right ~ inserted,+          Balanceable left  k' inserted+         )+         => InsertableHelper2 GT k R left k' right where+    type Insert2              GT k R left k' right = N R left k' (Insert1 k right)++data BalanceAction = BalanceSpecial+                   | BalanceLL+                   | BalanceLR+                   | BalanceRL+                   | BalanceRR+                   | DoNotBalance+                   deriving Show++type family ShouldBalance (left :: TypeSet ki) (right :: TypeSet ki) :: BalanceAction where+    ShouldBalance (N R _ _ _) (N R _ _ _) = BalanceSpecial+    ShouldBalance (N R (N R _ _ _) _ _) _ = BalanceLL+    ShouldBalance (N R _ _ (N R _ _ _)) _ = BalanceLR+    ShouldBalance _ (N R (N R _ _ _) _ _) = BalanceRL+    ShouldBalance _ (N R _ _ (N R _ _ _)) = BalanceRR+    ShouldBalance _ _                     = DoNotBalance++class Balanceable (left :: TypeSet ki) (k :: ki) (right :: TypeSet ki) where+    type Balance left k right :: TypeSet ki++instance (ShouldBalance left right ~ action,+          BalanceableHelper action left k right+         )+         => Balanceable left k right where+    -- FIXME possible duplicate work with ShouldBalance: both in constraint and in associated type family.+    -- Is that bad? How to avoid it?+    type Balance left k right = Balance' (ShouldBalance left right) left k right++class BalanceableHelper (action :: BalanceAction)+                        (left :: TypeSet ki)+                        (k :: ki)+                        (right :: TypeSet ki) where+    type Balance' action left k right :: TypeSet ki++-- balance (T R a x b) y (T R c z d) = T R (T B a x b) y (T B c z d)+instance BalanceableHelper BalanceSpecial (N R left1 k1 right1) kx (N R left2 k2 right2) where+    type Balance'          BalanceSpecial (N R left1 k1 right1) kx (N R left2 k2 right2) =+                                      N R (N B left1 k1 right1) kx (N B left2 k2 right2)++-- balance (T R (T R a x b) y c) z d = T R (T B a x b) y (T B c z d)+instance BalanceableHelper BalanceLL (N R (N R a k1 b) k2 c) k3 d where+    type Balance'          BalanceLL (N R (N R a k1 b) k2 c) k3 d =+                                 N R (N B a k1 b) k2 (N B c k3 d)++-- balance (T R a x (T R b y c)) z d = T R (T B a x b) y (T B c z d)+instance BalanceableHelper BalanceLR (N R a k1 (N R b k2 c)) k3 d where+    type Balance'          BalanceLR (N R a k1 (N R b k2 c)) k3 d =+                                 N R (N B a k1 b) k2 (N B c k3 d)++-- balance a x (T R (T R b y c) z d) = T R (T B a x b) y (T B c z d)+instance BalanceableHelper BalanceRL a k1 (N R (N R b k2 c) k3 d) where+    type Balance'          BalanceRL a k1 (N R (N R b k2 c) k3 d) =+                                 N R (N B a k1 b) k2 (N B c k3 d)+++-- balance a x (T R b y (T R c z d)) = T R (T B a x b) y (T B c z d)+instance BalanceableHelper BalanceRR a k1(N R b k2 (N R c k3 d)) where+    type Balance'          BalanceRR a k1(N R b k2 (N R c k3 d)) =+                                 N R (N B a k1 b) k2 (N B c k3 d)++-- balance a x b = T B a x b+instance BalanceableHelper DoNotBalance a k b where+    type Balance'          DoNotBalance a k b = N B a k b+++--- Member+---+---+------------------------------------------------------------------------------+-- | /O(log n)/. Determine membership in the 'TypeSet.'+type family Member (t :: k) (bst :: TypeSet k)  :: Bool where+  Member t 'E = 'False+  Member t ('N _ lbst a rbst) = MemberImpl (CmpType t a) t lbst rbst++type family MemberImpl (ord :: Ordering)+                       (t :: k)+                       (lbst :: TypeSet k)+                       (rbst :: TypeSet k) :: Bool where+  MemberImpl 'EQ t lbst rbst = 'True+  MemberImpl 'LT t lbst rbst = Member t lbst+  MemberImpl 'GT t lbst rbst = Member t rbst++------------------------------------------------------------------------------+-- | /O(m log n)/ for @Merge m n@; put your smaller set on the left side. Merge+-- two 'TypeSet's together.+type family Merge (small :: TypeSet k) (big :: TypeSet k) :: TypeSet k where+  Merge Empty big   = big+  Merge small Empty = small+  Merge ('N _ lbst a rbst) big = Merge rbst (Merge lbst (Insert a big))+++--+--+--+-- deletion+--+--+--++type family DiscriminateBalL (l :: TypeSet ki) (r :: TypeSet ki) :: Bool where+    DiscriminateBalL (N R _ _ _) _ = False+    DiscriminateBalL _           _ = True++class BalanceableL (l :: TypeSet ki) (k :: ki) (r :: TypeSet ki) where+    type BalL l k r :: TypeSet ki++class BalanceableHelperL (b :: Bool) (l :: TypeSet ki) (k :: ki) (r :: TypeSet ki) where+    type BalL' b l k r :: TypeSet ki++instance (DiscriminateBalL l r ~ b, BalanceableHelperL b l k r) => BalanceableL l k r where+    type BalL l k r = BalL' (DiscriminateBalL l r) l k r++-- balleft :: RB a -> a -> RB a -> RB a+-- balleft (T R a x b) y c = T R (T B a x b) y c+instance BalanceableHelperL False (N R left1 k1 right1) k2 right2 where+    type BalL'              False (N R left1 k1 right1) k2 right2 =+                             (N R (N B left1 k1 right1) k2 right2)++-- balleft bl x (T B a y b) = balance bl x (T R a y b)+-- the @(N B in the call to balance tree is misleading, as it is ingored...+instance (N R t2 z t3 ~ g, BalanceableHelper (ShouldBalance t1 g) t1 y g) =>+    BalanceableHelperL True t1 y (N B t2 z t3) where+    type BalL'         True t1 y (N B t2 z t3)+                 =  Balance t1 y (N R t2 z t3)++-- balleft bl x (T R (T B a y b) z c) = T R (T B bl x a) y (balance b z (sub1 c))+instance (N R l k r ~ g, BalanceableHelper    (ShouldBalance t3 g) t3 z g) =>+    BalanceableHelperL True t1 y (N R (N B t2 u t3) z (N B l k r)) where+    type BalL'         True t1 y (N R (N B t2 u t3) z (N B l k r)) =+                             N R (N B t1 y t2) u (Balance t3 z (N R l k r))+++-- balright :: RB a -> a -> RB a -> RB a+-- balright a x (T R b y c) = T R a x (T B b y c)+-- balright (T B a x b) y bl = balance (T R a x b) y bl+-- balright (T R a x (T B b y c)) z bl = T R (balance (sub1 a) x b) y (T B c z bl)+type family DiscriminateBalR (l :: TypeSet ki) (r :: TypeSet ki) :: Bool where+    DiscriminateBalR _ (N R _ _ _) = False+    DiscriminateBalR _ _           = True++class BalanceableR (l :: TypeSet ki) (k :: ki) (r :: TypeSet ki) where+    type BalR l k r :: TypeSet ki++class BalanceableHelperR (b :: Bool) (l :: TypeSet ki) (k :: ki) (r :: TypeSet ki) where+    type BalR' b l k r :: TypeSet ki++instance (DiscriminateBalR l r ~ b, BalanceableHelperR b l k r) => BalanceableR l k r where+    type BalR l k r = BalR' (DiscriminateBalR l r) l k r++-- balright :: RB a -> a -> RB a -> RB a+-- balright a x (T R b y c) = T R a x (T B b y c)+instance BalanceableHelperR False right2 k2 (N R left1 k1 right1) where+    type BalR'              False right2 k2 (N R left1 k1 right1) =+                                  (N R right2 k2 (N B left1 k1 right1))++-- balright (T B a x b) y bl = balance (T R a x b) y bl+instance (N R t2 z t3 ~ g, ShouldBalance g t1 ~ shouldbalance, BalanceableHelper shouldbalance g y t1) =>+    BalanceableHelperR True (N B t2 z t3) y t1 where+    type BalR'         True (N B t2 z t3) y t1+             =  Balance (N R t2 z t3) y t1++-- balright (T R a x (T B b y c)) z bl = T R (balance (sub1 a) x b) y (T B c z bl)+instance (N R t2 u t3 ~ g, ShouldBalance g l ~ shouldbalance, BalanceableHelper shouldbalance g z l) =>+    BalanceableHelperR True (N R (N B t2 u t3) z (N B l k r)) y t1 where+    type BalR'         True (N R (N B t2 u t3) z (N B l k r)) y t1 =+                             N R (Balance (N R t2 u t3) z l) k (N B r y t1)+-- app :: RB a -> RB a -> RB a+-- app E x = x+-- app x E = x+-- app (T R a x b) (T R c y d) =+--  case app b c of+--      T R b' z c' -> T R(T R a x b') z (T R c' y d)+--      bc -> T R a x (T R bc y d)+-- app (T B a x b) (T B c y d) =+--  case app b c of+--      T R b' z c' -> T R(T B a x b') z (T B c' y d)+--      bc -> balleft a x (T B bc y d)+-- app a (T R b x c) = T R (app a b) x c+-- app (T R a x b) c = T R a x (app b c)+++class Fuseable (l :: TypeSet ki) (r :: TypeSet ki) where+    type Fuse l r :: TypeSet ki++instance Fuseable E E where+    type Fuse E E = E++-- app E x = x+instance Fuseable E (N color left k right) where+    type Fuse E (N color left k right) = N color left k right++-- app x E = x+instance Fuseable (N color left k right) E where+    type Fuse (N color left k right) E = N color left k right++-- app a (T R b x c) = T R (app a b) x c+instance Fuseable (N B left1 k1 right1) left2+    => Fuseable (N B left1 k1 right1) (N R left2 k2 right2) where+    type Fuse   (N B left1 k1 right1) (N R left2 k2 right2) = N R (Fuse (N B left1 k1 right1) left2) k2 right2+++-- app (T R a x b) c = T R a x (app b c)+instance Fuseable right1 (N B left2 k2 right2)+    => Fuseable (N R left1 k1 right1) (N B left2 k2 right2) where+    type Fuse   (N R left1 k1 right1) (N B left2 k2 right2) = N R left1 k1 (Fuse right1 (N B left2 k2 right2))+++-- app (T R a x b) (T R c y d) =+instance (Fuseable right1 left2, Fuse right1 left2 ~ fused, FuseableHelper1 fused (N R left1 k1 right1) (N R left2 k2 right2))+    => Fuseable (N R left1 k1 right1) (N R left2 k2 right2) where+    type Fuse   (N R left1 k1 right1) (N R left2 k2 right2) = Fuse1 (Fuse right1 left2) (N R left1 k1 right1) (N R left2 k2 right2)++class FuseableHelper1 (fused :: TypeSet ki) (l :: TypeSet ki) (r :: TypeSet ki) where+    type Fuse1 fused l r :: TypeSet ki++-- app (T R a x b) (T R c y d) =+--  case app b c of+--      T R b' z c' -> T R (T R a x b') z (T R c' y d)+-- FIXME: The Fuseable constraint is repeated from avobe :(+instance (Fuseable right1 left2, Fuse right1 left2 ~ N R s1 z s2)+    => FuseableHelper1 (N R s1 z s2) (N R left1 k1 right1) (N R left2 k2 right2) where+    type Fuse1         (N R s1 z s2) (N R left1 k1 right1) (N R left2 k2 right2) = N R (N R left1 k1 s1) z (N R s2 k2 right2)+++-- app (T R a x b) (T R c y d) =+--  case app b c of+--      ...+--      bc -> T R a x (T R bc y d)+-- FIXME: The Fuseable constraint is repeated from above :(+instance (Fuseable right1 left2, Fuse right1 left2 ~ N B s1 z s2)+    => FuseableHelper1 (N B s1 z s2) (N R left1 k1 right1) (N R left2 k2 right2) where+    type Fuse1         (N B s1 z s2) (N R left1 k1 right1) (N R left2 k2 right2) = N R left1 k1 (N R (N B s1 z s2) k2 right2)++-- app (T R a x b) (T R c y d) =+--  case app b c of+--      ...+--      bc -> T R a x (T R bc y d)+instance FuseableHelper1 E (N R left1 k1 E) (N R E k2 right2) where+    type Fuse1           E (N R left1 k1 E) (N R E k2 right2) = N R left1 k1 (N R E k2 right2)++-- app (T B a x b) (T B c y d) =+instance (Fuseable right1 left2, Fuse right1 left2 ~ fused, FuseableHelper2 fused (N B left1 k1 right1) (N B left2 k2 right2))+    => Fuseable (N B left1 k1 right1) (N B left2 k2 right2) where+    type Fuse   (N B left1 k1 right1) (N B left2 k2 right2) = Fuse2 (Fuse right1 left2) (N B left1 k1 right1) (N B left2 k2 right2)++-- could FuseableHelper1 and FuseableHelper2 be, well... fused?+class FuseableHelper2 (fused :: TypeSet ki) (l :: TypeSet ki) (r :: TypeSet ki) where+    type Fuse2 fused l r :: TypeSet ki++-- app (T B a x b) (T B c y d) =+--  case app b c of+--      T R b' z c' -> T R (T B a x b') z (T B c' y d)+instance (Fuseable right1 left2, Fuse right1 left2 ~ N R s1 z s2)+    => FuseableHelper2 (N R s1 z s2) (N B left1 k1 right1) (N B left2 k2 right2) where+    type Fuse2         (N R s1 z s2) (N B left1 k1 right1) (N B left2 k2 right2) = N R (N B left1 k1 s1) z (N B s2 k2 right2)++-- app (T B a x b) (T B c y d) =+--  case app b c of+--      ...+--      bc -> balleft a x (T B bc y d)+instance (Fuseable right1 left2, Fuse right1 left2 ~ N B s1 z s2, BalanceableL left1 k1 (N B (N B s1 z s2) k2 right2))+    => FuseableHelper2 (N B s1 z s2) (N B left1 k1 right1) (N B left2 k2 right2) where+    type Fuse2         (N B s1 z s2) (N B left1 k1 right1) (N B left2 k2 right2) = BalL left1 k1 (N B (N B s1 z s2) k2 right2)++-- app (T B a x b) (T B c y d) =+--  case app b c of+--      ...+--      bc -> balleft a x (T B bc y d)+instance (BalanceableL left1 k1 (N B E k2 right2))+    => FuseableHelper2 E (N B left1 k1 E) (N B E k2 right2) where+    type Fuse2         E (N B left1 k1 E) (N B E k2 right2) = BalL left1 k1 (N B E k2 right2)+++--  del E = E+--  del (T _ a y b)+--      | x<y = delformLeft a y b+--      | x>y = delformRight a y b+--      | otherwise = app a b+class Delable (k :: ki) (t :: TypeSet ki) where+    type Del k t :: TypeSet ki++--  delformLeft a@(T B _ _ _) y b = balleft (del a) y b+--  delformLeft a y b = T R (del a) y b+--  In the term-level code, the k to delete is already on the environment.+class DelableL (k :: ki) (l :: TypeSet ki) (kx :: ki)  (r :: TypeSet ki) where+    type DelL k l kx r :: TypeSet ki++--  delformLeft a@(T B _ _ _) y b = balleft (del a) y b+instance (N B leftz kz rightz ~ g, Delable k g, Del k g ~ deleted, BalanceableL deleted kx right)+    => DelableL k (N B leftz kz rightz) kx right where+    type DelL   k (N B leftz kz rightz) kx right = BalL (Del k (N B leftz kz rightz)) kx right++--  delformLeft a y b = T R (del a) y b+instance (Delable k (N R leftz kz rightz))+    => DelableL k (N R leftz kz rightz) kx right where+    type DelL   k (N R leftz kz rightz) kx right = N R (Del k (N R leftz kz rightz)) kx right++--  delformLeft a y b = T R (del a) y b+instance DelableL k E kx right where+    type DelL     k E kx right = N R E kx right++--  delformRight a y b@(T B _ _ _) = balright a y (del b)+--  delformRight a y b = T R a y (del b)+class DelableR (k :: ki) (l :: TypeSet ki) (kx :: ki) (r :: TypeSet ki) where+    type DelR k l kx r :: TypeSet ki++--  delformRight a y b@(T B _ _ _) = balright a y (del b)+instance (N B leftz kz rightz ~ g, Delable k g, Del k g ~ deleted, BalanceableR left kx deleted)+    => DelableR k left kx (N B leftz kz rightz) where+    type DelR   k left kx (N B leftz kz rightz) = BalR left kx (Del k (N B leftz kz rightz))+++--  delformRight a y b = T R a y (del b)+instance (Delable k (N R leftz kz rightz))+    => DelableR k left kx (N R leftz kz rightz) where+    type   DelR k left kx (N R leftz kz rightz) = N R left kx (Del k (N R leftz kz rightz))++--  delformRight a y b = T R a y (del b)+instance DelableR k left kx E where+    type DelR     k left kx E = N R left kx E++--  del E = E+instance Delable k E where+    type Del     k E = E++-- the color is discarded+--  del (T _ a y b)+--      | x<y = delformLeft a y b+--      | x>y = delformRight a y b+--      | otherwise = app a b+instance (CmpType kx k ~ ordering, DelableHelper ordering k left kx right) => Delable k (N color left kx right) where+    type Del k (N color left kx right) = Del' (CmpType kx k) k left kx right++class DelableHelper (ordering :: Ordering) (k :: ki) (l :: TypeSet ki) (kx :: ki) (r :: TypeSet ki) where+    type Del' ordering k l kx r :: TypeSet ki++--      | x<y = delformLeft a y b+instance DelableL k left kx right => DelableHelper GT k left kx right where+    type Del'                                      GT k left kx right = DelL k left kx right++--      | otherwise = app a b+instance Fuseable left right => DelableHelper EQ k left k right where+    type Del'                                 EQ k left k right = Fuse left right++--      | x>y = delformRight a y b+instance DelableR k left kx right => DelableHelper LT k left kx right where+    type Del'                                      LT k left kx right = DelR k left kx right++{- | The associated type family 'Remove' produces the resulting map.++ -}+class Removable (k :: ki) (t :: TypeSet ki) where+    type Remove k t :: TypeSet ki++instance (Delable k t, Del k t ~ deleted, CanMakeBlack deleted) => Removable k t where+    type Remove k t = MakeBlack (Del k t)++++-- The original term-level code, taken from:+-- https://www.cs.kent.ac.uk/people/staff/smk/redblack/rb.html+--+-- {- Version 1, 'untyped' -}+-- data Color = R | B deriving Show+-- data RB a = E | T Color (RB a) a (RB a) deriving Show+--+-- {- Insertion and membership test as by Okasaki -}+-- insert :: Ord a => a -> RB a -> RB a+-- insert x s =+--  T B a z b+--  where+--  T _ a z b = ins s+--  ins E = T R E x E+--  ins s@(T B a y b)+--      | x<y = balance (ins a) y b+--      | x>y = balance a y (ins b)+--      | otherwise = s+--  ins s@(T R a y b)+--      | x<y = T R (ins a) y b+--      | x>y = T R a y (ins b)+--      | otherwise = s+--+--+-- {- balance: first equation is new,+--    to make it work with a weaker invariant -}+-- balance :: RB a -> a -> RB a -> RB a+-- balance (T R a x b) y (T R c z d) = T R (T B a x b) y (T B c z d)+-- balance (T R (T R a x b) y c) z d = T R (T B a x b) y (T B c z d)+-- balance (T R a x (T R b y c)) z d = T R (T B a x b) y (T B c z d)+-- balance a x (T R b y (T R c z d)) = T R (T B a x b) y (T B c z d)+-- balance a x (T R (T R b y c) z d) = T R (T B a x b) y (T B c z d)+-- balance a x b = T B a x b+--+-- member :: Ord a => a -> RB a -> Bool+-- member x E = False+-- member x (T _ a y b)+--  | x<y = member x a+--  | x>y = member x b+--  | otherwise = True+--+-- {- deletion a la SMK -}+-- delete :: Ord a => a -> RB a -> RB a+-- delete x t =+--  case del t of {T _ a y b -> T B a y b; _ -> E}+--  where+--  del E = E+--  del (T _ a y b)+--      | x<y = delformLeft a y b+--      | x>y = delformRight a y b+--             | otherwise = app a b+--  delformLeft a@(T B _ _ _) y b = balleft (del a) y b+--  delformLeft a y b = T R (del a) y b+--+--  delformRight a y b@(T B _ _ _) = balright a y (del b)+--  delformRight a y b = T R a y (del b)+--+-- balleft :: RB a -> a -> RB a -> RB a+-- balleft (T R a x b) y c = T R (T B a x b) y c+-- balleft bl x (T B a y b) = balance bl x (T R a y b)+-- balleft bl x (T R (T B a y b) z c) = T R (T B bl x a) y (balance b z (sub1 c))+--+-- balright :: RB a -> a -> RB a -> RB a+-- balright a x (T R b y c) = T R a x (T B b y c)+-- balright (T B a x b) y bl = balance (T R a x b) y bl+-- balright (T R a x (T B b y c)) z bl = T R (balance (sub1 a) x b) y (T B c z bl)+--+-- sub1 :: RB a -> RB a+-- sub1 (T B a x b) = T R a x b+-- sub1 _ = error "invariance violation"+--+-- app :: RB a -> RB a -> RB a+-- app E x = x+-- app x E = x+-- app (T R a x b) (T R c y d) =+--  case app b c of+--      T R b' z c' -> T R (T R a x b') z (T R c' y d)+--      bc -> T R a x (T R bc y d)+-- app (T B a x b) (T B c y d) =+--  case app b c of+--      T R b' z c' -> T R(T B a x b') z (T B c' y d)+--      bc -> balleft a x (T B bc y d)+-- app a (T R b x c) = T R (app a b) x c+-- app (T R a x b) c = T R a x (app b c)+
test/Spec.hs view
@@ -1,10 +1,13 @@ {-# LANGUAGE DataKinds #-}  {-# OPTIONS_GHC -fplugin=Type.Compare.Plugin      #-}-{-# OPTIONS_GHC -fconstraint-solver-iterations=10 #-}+{-# OPTIONS_GHC -fconstraint-solver-iterations=0  #-} -- with iterations=10, bit sets fail in the RB tests :(  import Data.Proxy+import Data.Functor.Identity+import Data.Functor.Const import Type.Set+import qualified Type.RBSet as RB  type MySet = Insert Bool (Insert String (Insert (Maybe Int) 'Empty)) @@ -13,6 +16,198 @@  test2 :: Proxy (Member Char MySet) -> Proxy 'False test2 = id  -- False is not a member :(++-- RB tests+--+--+type MyRBSet = RB.FromList '[+                              Bool+                            , String+                            , String+                            , String+                            , Maybe Int+                            , Maybe Char+                            , Char+                            , Either Int Int+                            , Either Int Int+                            , Either Int Int+                            , Either Char Int+                            , Either Bool Int+                            , Maybe Bool+                            , Identity Int+                            , Identity Char+                            , Identity Bool+                            , Either Int (Identity Int)+                            , Either Int (Identity Char)+                            , Either Int (Identity Bool)+                            , Either Char (Identity Int)+                            , Either Char (Identity Char)+                            , Either Char (Identity Bool)+                            , Either Bool (Identity Int)+                            , Either Bool (Identity Char)+                            , Either Bool (Identity Bool)+                            ]++type MyReducedRBSet = RB.Remove Bool+                    ( RB.Remove String+                    ( RB.Remove (Either Int Int)+                    ( RB.Remove (Either Char Int)+                    ( RB.Remove (Either Bool (Identity Int))+                    ( RB.Remove (Either Bool (Identity Char))+                    ( RB.Remove (Either Bool (Identity Bool))+                      MyRBSet))))))++type MyReducedToEmptyRBSet =+                      RB.Remove (Maybe Int)+                    ( RB.Remove (Maybe Char)+                    ( RB.Remove Char+                    ( RB.Remove (Either Bool Int)+                    ( RB.Remove (Maybe Bool)+                    ( RB.Remove (Identity Int)+                    ( RB.Remove (Identity Char)+                    ( RB.Remove (Identity Bool)+                    ( RB.Remove (Either Int (Identity Int))+                    ( RB.Remove (Either Int (Identity Char))+                    ( RB.Remove (Either Int (Identity Bool))+                    ( RB.Remove (Either Char (Identity Int))+                    ( RB.Remove (Either Char (Identity Char))+                    ( RB.Remove (Either Char (Identity Bool))+                      MyReducedRBSet)))))))))))))++type MyMergedRBSet = RB.Merge (RB.FromList '[Const Int Bool,+                                             Const Int Char,+                                             Const Int String])+                              MyReducedRBSet++testRB1 :: Proxy (RB.Member (Bool) MyRBSet) -> Proxy 'True+testRB1 = id+testRB2 :: Proxy (RB.Member (String) MyRBSet) -> Proxy 'True+testRB2 = id+testRB3 :: Proxy (RB.Member (Maybe Int) MyRBSet) -> Proxy 'True+testRB3 = id+testRB4 :: Proxy (RB.Member (Maybe Char) MyRBSet) -> Proxy 'True+testRB4 = id+testRB5 :: Proxy (RB.Member (Char) MyRBSet) -> Proxy 'True+testRB5 = id+testRB6 :: Proxy (RB.Member (Either Int Int) MyRBSet) -> Proxy 'True+testRB6 = id+testRB7 :: Proxy (RB.Member (Either Char Int) MyRBSet) -> Proxy 'True+testRB7 = id+testRB8 :: Proxy (RB.Member (Either Bool Int) MyRBSet) -> Proxy 'True+testRB8 = id+testRB9 :: Proxy (RB.Member (Maybe Bool) MyRBSet) -> Proxy 'True+testRB9 = id+testRB10 :: Proxy (RB.Member (Identity Int) MyRBSet) -> Proxy 'True+testRB10 = id+testRB11 :: Proxy (RB.Member (Identity Char) MyRBSet) -> Proxy 'True+testRB11 = id+testRB12 :: Proxy (RB.Member (Identity Bool) MyRBSet) -> Proxy 'True+testRB12 = id+testRB13 :: Proxy (RB.Member (Either Int (Identity Int)) MyRBSet) -> Proxy 'True+testRB13 = id+testRB14 :: Proxy (RB.Member (Either Int (Identity Char)) MyRBSet) -> Proxy 'True+testRB14 = id+testRB15 :: Proxy (RB.Member (Either Int (Identity Bool)) MyRBSet) -> Proxy 'True+testRB15 = id+testRB16 :: Proxy (RB.Member (Either Char (Identity Int)) MyRBSet) -> Proxy 'True+testRB16 = id+testRB17 :: Proxy (RB.Member (Either Char (Identity Char)) MyRBSet) -> Proxy 'True+testRB17 = id+testRB18 :: Proxy (RB.Member (Either Char (Identity Bool)) MyRBSet) -> Proxy 'True+testRB18 = id+testRB19 :: Proxy (RB.Member (Either Bool (Identity Int)) MyRBSet) -> Proxy 'True+testRB19 = id+testRB20 :: Proxy (RB.Member (Either Bool (Identity Char)) MyRBSet) -> Proxy 'True+testRB20 = id+testRB21 :: Proxy (RB.Member (Either Bool (Identity Bool)) MyRBSet) -> Proxy 'True+testRB21 = id++testRB102 :: Proxy (RB.Member Float MyRBSet) -> Proxy 'False+testRB102 = id  -- False is not a member :(++--+-- Test MyReducedRBSet+testRB201 :: Proxy (RB.Member (Bool) MyReducedRBSet) -> Proxy 'False+testRB201 = id+testRB202 :: Proxy (RB.Member (String) MyReducedRBSet) -> Proxy 'False+testRB202 = id+testRB203 :: Proxy (RB.Member (Either Int Int) MyReducedRBSet) -> Proxy 'False+testRB203 = id+testRB204 :: Proxy (RB.Member (Either Char Int) MyReducedRBSet) -> Proxy 'False+testRB204 = id+testRB205 :: Proxy (RB.Member (Either Bool (Identity Int)) MyReducedRBSet) -> Proxy 'False+testRB205 = id+testRB206 :: Proxy (RB.Member (Either Bool (Identity Char)) MyReducedRBSet) -> Proxy 'False+testRB206 = id+testRB207 :: Proxy (RB.Member (Either Bool (Identity Bool)) MyReducedRBSet) -> Proxy 'False+testRB207 = id++-- the rest remain+testRB303 :: Proxy (RB.Member (Maybe Int) MyReducedRBSet) -> Proxy 'True+testRB303 = id+testRB304 :: Proxy (RB.Member (Maybe Char) MyReducedRBSet) -> Proxy 'True+testRB304 = id+testRB305 :: Proxy (RB.Member (Char) MyReducedRBSet) -> Proxy 'True+testRB305 = id+testRB308 :: Proxy (RB.Member (Either Bool Int) MyReducedRBSet) -> Proxy 'True+testRB308 = id+testRB309 :: Proxy (RB.Member (Maybe Bool) MyReducedRBSet) -> Proxy 'True+testRB309 = id+testRB310 :: Proxy (RB.Member (Identity Int) MyReducedRBSet) -> Proxy 'True+testRB310 = id+testRB311 :: Proxy (RB.Member (Identity Char) MyReducedRBSet) -> Proxy 'True+testRB311 = id+testRB312 :: Proxy (RB.Member (Identity Bool) MyReducedRBSet) -> Proxy 'True+testRB312 = id+testRB313 :: Proxy (RB.Member (Either Int (Identity Int)) MyReducedRBSet) -> Proxy 'True+testRB313 = id+testRB314 :: Proxy (RB.Member (Either Int (Identity Char)) MyReducedRBSet) -> Proxy 'True+testRB314 = id+testRB315 :: Proxy (RB.Member (Either Int (Identity Bool)) MyReducedRBSet) -> Proxy 'True+testRB315 = id+testRB316 :: Proxy (RB.Member (Either Char (Identity Int)) MyReducedRBSet) -> Proxy 'True+testRB316 = id+testRB317 :: Proxy (RB.Member (Either Char (Identity Char)) MyReducedRBSet) -> Proxy 'True+testRB317 = id+testRB318 :: Proxy (RB.Member (Either Char (Identity Bool)) MyReducedRBSet) -> Proxy 'True+testRB318 = id++-- Tests for MyMergedRBSet+testRB400 :: Proxy (RB.Member (Const Int Bool) MyMergedRBSet) -> Proxy 'True+testRB400 = id+testRB401 :: Proxy (RB.Member (Const Int Char) MyMergedRBSet) -> Proxy 'True+testRB401 = id+testRB402 :: Proxy (RB.Member (Const Int String) MyMergedRBSet) -> Proxy 'True+testRB402 = id++testRB403 :: Proxy (RB.Member (Maybe Int) MyMergedRBSet) -> Proxy 'True+testRB403 = id+testRB404 :: Proxy (RB.Member (Maybe Char) MyMergedRBSet) -> Proxy 'True+testRB404 = id+testRB405 :: Proxy (RB.Member (Char) MyMergedRBSet) -> Proxy 'True+testRB405 = id+testRB408 :: Proxy (RB.Member (Either Bool Int) MyMergedRBSet) -> Proxy 'True+testRB408 = id+testRB409 :: Proxy (RB.Member (Maybe Bool) MyMergedRBSet) -> Proxy 'True+testRB409 = id+testRB410 :: Proxy (RB.Member (Identity Int) MyMergedRBSet) -> Proxy 'True+testRB410 = id+testRB411 :: Proxy (RB.Member (Identity Char) MyMergedRBSet) -> Proxy 'True+testRB411 = id+testRB412 :: Proxy (RB.Member (Identity Bool) MyMergedRBSet) -> Proxy 'True+testRB412 = id+testRB413 :: Proxy (RB.Member (Either Int (Identity Int)) MyMergedRBSet) -> Proxy 'True+testRB413 = id+testRB414 :: Proxy (RB.Member (Either Int (Identity Char)) MyMergedRBSet) -> Proxy 'True+testRB414 = id+testRB415 :: Proxy (RB.Member (Either Int (Identity Bool)) MyMergedRBSet) -> Proxy 'True+testRB415 = id+testRB416 :: Proxy (RB.Member (Either Char (Identity Int)) MyMergedRBSet) -> Proxy 'True+testRB416 = id+testRB417 :: Proxy (RB.Member (Either Char (Identity Char)) MyMergedRBSet) -> Proxy 'True+testRB417 = id+testRB418 :: Proxy (RB.Member (Either Char (Identity Bool)) MyMergedRBSet) -> Proxy 'True+testRB418 = id  main :: IO () main = putStrLn "It compiled!"
type-sets.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 60b368d526cc5cac3b6dd1535ea9d63df46fe48ac16f522464490b53a71a034b+-- hash: b462ce7243b616ca6d6a73fd65f8ead37c671611e51cbcd0c759f4cf55154214  name:           type-sets-version:        0.1.0.0+version:        0.1.1.0 synopsis:       Type-level sets description:    Please see the README on GitHub at <https://github.com/isovector/type-sets#readme> category:       Type@@ -29,6 +29,7 @@  library   exposed-modules:+      Type.RBSet       Type.Set       Type.Set.Variant   other-modules:@@ -37,7 +38,7 @@       src   build-depends:       base >=4.7 && <5-    , cmptype >=0.1.0.0 && <0.2+    , cmptype >=0.1.0.0 && <=0.3.0.0   default-language: Haskell2010  test-suite type-sets-test@@ -50,6 +51,6 @@   ghc-options: -threaded -rtsopts -with-rtsopts=-N   build-depends:       base >=4.7 && <5-    , cmptype >=0.1.0.0 && <0.2+    , cmptype >=0.1.0.0 && <=0.3.0.0     , type-sets   default-language: Haskell2010