-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Type-level sets -- -- Please see the README on GitHub at -- https://github.com/isovector/type-sets#readme @package type-sets @version 0.1.1.0 -- | See here for the original term-level code by Stefan Kahrs. module Type.RBSet -- | A Red-Black tree. data TypeSet a E :: TypeSet a N :: Color -> TypeSet a -> a -> TypeSet a -> TypeSet a -- | A map without entries. type Empty = E -- | O(log n). Determine membership in the 'TypeSet.' type family Member (t :: k) (bst :: TypeSet k) :: Bool -- | The associated type family Insert produces the resulting map. class Insertable (k :: ki) (t :: TypeSet ki) where { type family Insert k t :: TypeSet ki; } -- | Insert a list of type level key / value pairs into a type-level map. type family InsertAll (es :: [k]) (t :: TypeSet k) :: TypeSet k -- | 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 Remove produces the resulting map. class Removable (k :: ki) (t :: TypeSet ki) where { type family Remove k t :: TypeSet ki; } -- | O(m log n) for Merge m n; put your smaller set on the -- left side. Merge two TypeSets together. type family Merge (small :: TypeSet k) (big :: TypeSet k) :: TypeSet k instance GHC.Show.Show Type.RBSet.BalanceAction instance GHC.Classes.Eq a => GHC.Classes.Eq (Type.RBSet.TypeSet a) instance GHC.Show.Show a => GHC.Show.Show (Type.RBSet.TypeSet a) instance GHC.Classes.Eq Type.RBSet.Color instance GHC.Show.Show Type.RBSet.Color 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 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) 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 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 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 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) 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) instance forall ki (k :: ki) (left :: Type.RBSet.TypeSet ki) (kx :: ki). Type.RBSet.DelableR k left kx 'Type.RBSet.E 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 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 instance forall ki (k :: ki) (kx :: ki) (right :: Type.RBSet.TypeSet ki). Type.RBSet.DelableL k 'Type.RBSet.E kx right instance forall ki (k :: ki). Type.RBSet.Delable k 'Type.RBSet.E 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) 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) 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) 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) 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) 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) 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) 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) instance Type.RBSet.Fuseable 'Type.RBSet.E 'Type.RBSet.E 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) 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 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) 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) 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 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) 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 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 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 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 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) 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)) 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 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) 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 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 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) 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)) instance forall ki (a :: Type.RBSet.TypeSet ki) (k :: ki) (b :: Type.RBSet.TypeSet ki). Type.RBSet.BalanceableHelper 'Type.RBSet.DoNotBalance a k b 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 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 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 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 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) 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 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 instance forall ki (k :: ki). Type.RBSet.InsertableHelper1 k 'Type.RBSet.E 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) instance Type.RBSet.CanMakeBlack 'Type.RBSet.E module Type.Set -- | A binary search tree. When -XDataKinds is turned on, this -- becomes the backbone of the type-level set. -- --
-- >>> type MySet = Insert Bool (Insert String (Insert (Maybe Int) 'Empty)) --data TypeSet a Empty :: TypeSet a Branch :: a -> TypeSet a -> TypeSet a -> TypeSet a -- | O(log n). Determine membership in the 'TypeSet.' type family Member (t :: k) (bst :: TypeSet k) :: Bool -- | O(log n). Insert an element into the TypeSet. type family Insert (t :: k) (bst :: TypeSet k) :: TypeSet k -- | O(log n). Remove an element from the TypeSet. type family Remove (t :: k) (bst :: TypeSet k) :: TypeSet k -- | O(m log n) for Merge m n; put your smaller set on the -- left side. Merge two TypeSets together. type family Merge (small :: TypeSet k) (big :: TypeSet k) :: TypeSet k -- | O(log n). Compute a [Side] which finds the -- desired element in the tree. The result of this can be passed to -- Follow in order to look up the same element again later. type family Locate (t :: k) (bst :: TypeSet k) :: [Side] -- | O(log n). Follow the result of a Locate to get a -- particular element in the tree. type family Follow (ss :: [Side]) (bst :: TypeSet k) :: k -- | Either left or right down a path. data Side L :: Side R :: Side instance GHC.Show.Show Type.Set.Side instance GHC.Classes.Ord Type.Set.Side instance GHC.Classes.Eq Type.Set.Side module Type.Set.Variant -- | A Variant is like an Either, except that it can store -- any of the types contained in the TypeSet. You can use -- toVariant to construct one, and fromVariant to pattern -- match it out. data Variant (v :: TypeSet *) [Variant] :: SSide ss -> Follow ss v -> Variant v -- | A proof that the set bst contains type t. class Has t bst -- | Inject a t into a Variant. toVariant :: Has t bst => t -> Variant bst -- | Attempt to project a Variant into t. This might fail, -- because there is no guarantee that the Variant actually -- contains t. -- -- You can use decompRoot instead of this function if you'd like a -- proof that the Variant doesn't contain t in the case -- of failure. fromVariant :: Has t bst => Variant bst -> Maybe t -- | Like fromVariant, but decomposes the Variant into its -- left and right branches, depending on where t is. decompRoot :: Variant ( 'Branch t lbst rbst) -> Split t lbst rbst data Split t lbst rbst Root :: t -> Split t lbst rbst LSplit :: Variant lbst -> Split t lbst rbst RSplit :: Variant rbst -> Split t lbst rbst -- | Weaken a Variant so that it can contain something else. weaken :: forall t bst. Variant bst -> Variant (Insert t bst) -- | A proof that inserting into a bst doesn't affect the position -- of anything already in the tree. proveFollowInsert :: Follow ss (Insert t bst) :~: Follow ss bst -- | Singletons for Sides. data SSide (ss :: [Side]) [SNil] :: SSide '[] [SL] :: SSide ss -> SSide ( 'L : ss) [SR] :: SSide ss -> SSide ( 'R : ss) -- | Get a singleton for a list of Sides. class FromSides (ss :: [Side]) fromSides :: FromSides ss => SSide ss instance (Type.Set.Follow (Type.Set.Locate t bst) bst Data.Type.Equality.~ t, Type.Set.Variant.FromSides (Type.Set.Locate t bst)) => Type.Set.Variant.Has t bst instance Type.Set.Variant.FromSides '[] instance Type.Set.Variant.FromSides ss => Type.Set.Variant.FromSides ('Type.Set.L : ss) instance Type.Set.Variant.FromSides ss => Type.Set.Variant.FromSides ('Type.Set.R : ss) instance Data.Type.Equality.TestEquality Type.Set.Variant.SSide