-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Primitive list with elements of unique types. -- @package hset @version 2.1.0 module Data.HSet.TypeLevel data Nat Z :: Nat S :: Nat -> Nat -- | Calculates to 'True if first type argument contained in second list -- element -- | Calculates to Nat kinded type describing the index of first argument -- in second argument type MayIndex typ typs = MayIndexGo typ typs Z -- | Type level list length -- | Append element to type list if element is not presented in list -- already -- | Calculates union two lists -- | Union list of lists of elements. Return just unique elements of each -- nested list type UnionList l = UnionList' [] l -- | Reverse list of elements type Reverse a = XReverse [] a -- | Delete element from type list -- | Replace first arbitrary element typ1 in type list with -- typ2 -- | Wrap first element with Tagged tag type TagElem (tag :: k) (typ :: *) (typs :: [*]) = Replace typ (Tagged tag typ) typs -- | Checks if the former subset included in the latter one. module Data.HSet.Type -- | Heterogeneous set (list of elements) with unique types. Useful with -- MonadReader. data HSet (elems :: [*]) HSNil :: HSet [] HSCons :: !elem -> HSet elems -> HSet (elem : elems) instance Typeable HSet instance (NFData e, NFData (HSet els)) => NFData (HSet (e : els)) instance NFData (HSet '[]) instance (Ord e, Ord (HSet els)) => Ord (HSet (e : els)) instance Ord (HSet '[]) instance (Eq e, Eq (HSet els)) => Eq (HSet (e : els)) instance Eq (HSet '[]) instance (Show e, Show (HSet els)) => Show (HSet (e : els)) instance Show (HSet '[]) module Data.HSet.Reverse -- | This is auxiliary typeclass for inversing the order of hset elements class HReverse acc els1 els2 | acc els1 -> els2 hreverse' :: HReverse acc els1 els2 => HSet acc -> HSet els1 -> HSet els2 type HReversible els1 els2 = HReverse [] els1 els2 hreverse :: HReversible a r => HSet a -> HSet r instance ((e : els1) ~ Reverse els2, HReverse '[e] els1 els2) => HReverse '[] (e : els1) els2 instance ('False ~ Elem e (ah : at), HReverse (e : ah : at) els1 els2) => HReverse (ah : at) (e : els1) els2 instance HReverse acc '[] acc module Data.HSet.Remove -- | Remove i's element from hset. Second argument is a resulting hset type class HRemove els1 els2 i | els1 i -> els2 hremove :: HRemove els1 els2 i => Proxy i -> HSet els1 -> HSet els2 -- | Delete element from HSet of specified type -- --
--   >>> let x = (HSCons "sdf" $ HSCons 123 HSNil) :: HSet '[String, Int]
--   
-- --
--   >>> hdelete (Proxy :: Proxy Int) x
--   HSCons ("sdf") (HSNil)
--   
-- --
--   >>> hdelete (Proxy :: Proxy String) x
--   HSCons (123) (HSNil)
--   
-- -- Constraints that e can be removed from els1 and els2 will be produced -- in result type HDeletable e els1 els2 = HRemove els1 els2 (Index e els1) -- | Delete specific element from els1 and returns HSet with els2 hdelete :: HDeletable e els1 els2 => proxy e -> HSet els1 -> HSet els2 instance ('False ~ Elem e els2, HRemove els1 els2 i) => HRemove (e : els1) (e : els2) ('S i) instance HRemove (e : els) els 'Z module Data.HSet.Union class (fidx ~ (MayFstIndexSnd els1 els2), sidx ~ (MayFstIndexSnd els2 els1)) => HUnion els1 els2 elsr fidx sidx | els1 els2 fidx sidx -> elsr hunion :: HUnion els1 els2 elsr fidx sidx => HSet els1 -> HSet els2 -> HSet elsr type HUnionable els1 els2 elsr = HUnion els1 els2 elsr (MayFstIndexSnd els1 els2) (MayFstIndexSnd els2 els1) instance (HUnionable els1 els2 elsr, 'False ~ Elem e1 elsr, 'Nothing ~ MayFstIndexSnd (e1 : els1) (e2 : els2), 'Just si ~ MayFstIndexSnd (e2 : els2) (e1 : els1)) => HUnion (e1 : els1) (e2 : els2) (e1 : elsr) 'Nothing ('Just si) instance (HRemove els2 elsx fi, HUnionable els1 elsx elsr, 'False ~ Elem e1 elsr, 'Just fi ~ MayFstIndexSnd (e1 : els1) els2, 'Nothing ~ MayFstIndexSnd els2 (e1 : els1)) => HUnion (e1 : els1) els2 (e1 : elsr) ('Just fi) 'Nothing instance (HRemove els2 elsx fi, HUnionable els1 elsx elsr, 'False ~ Elem e1 elsr, 'Just ('S fi) ~ MayFstIndexSnd (e1 : els1) (e2 : els2), 'Just si ~ MayFstIndexSnd (e2 : els2) (e1 : els1)) => HUnion (e1 : els1) (e2 : els2) (e1 : elsr) ('Just ('S fi)) ('Just si) instance (HUnionable els1 els2 elsr, 'False ~ Elem e elsr) => HUnion (e : els1) (e : els2) (e : elsr) ('Just 'Z) ('Just 'Z) instance (HUnionable els1 els2 elsr, 'False ~ Elem e1 (e2 : elsr), 'False ~ Elem e2 elsr, 'Nothing ~ MayFstIndexSnd (e1 : els1) (e2 : els2), 'Nothing ~ MayFstIndexSnd (e2 : els2) (e1 : els1)) => HUnion (e1 : els1) (e2 : els2) (e1 : e2 : elsr) 'Nothing 'Nothing instance HUnion (e : els) '[] (e : els) 'Nothing 'Nothing instance HUnion '[] (e : els) (e : els) 'Nothing 'Nothing instance HUnion '[] '[] '[] 'Nothing 'Nothing module Data.HSet.Modify class (i ~ (Index e1 els1), i ~ (Index e2 els2)) => HModify els1 els2 e1 e2 i | els1 i -> e1, els2 i -> e2, els1 e1 e2 i -> els2, els2 e1 e2 i -> els1 hmodify :: HModify els1 els2 e1 e2 i => (e1 -> e2) -> HSet els1 -> HSet els2 -- | Check that we can turn one hset to another type HModifiable els1 els2 e1 e2 = HModify els1 els2 e1 e2 (Index e1 els1) -- | Helper type infering that hset els contains element of type -- e and can be modified type HMonoModifiable els e = HModifiable els els e e -- | Like hmodify but do not change the hset's type hMonoModify :: HMonoModifiable els e => (e -> e) -> HSet els -> HSet els hModifyTagged :: HModifiable els1 els2 (Tagged l e1) (Tagged l e2) => proxy l -> (e1 -> e2) -> HSet els1 -> HSet els2 hMonoModifyTagged :: HMonoModifiable els (Tagged l e) => proxy l -> (e -> e) -> HSet els -> HSet els hUntag :: HModifiable els1 els2 (Tagged l e) e => proxy l -> proxy e -> HSet els1 -> HSet els2 hTag :: HModifiable els1 els2 e (Tagged l e) => proxy l -> proxy e -> HSet els1 -> HSet els2 instance ('S i ~ Index e1 (ex : els1), 'S i ~ Index e2 (ex : els2), HModify els1 els2 e1 e2 i, 'False ~ Elem ex els2) => HModify (ex : els1) (ex : els2) e1 e2 ('S i) instance 'False ~ Elem e2 els => HModify (e1 : els) (e2 : els) e1 e2 'Z module Data.HSet.Get -- | Heterogeneous read arbitrarily element from hset -- --
--   >>> let x = HSCons (10 :: Int) $ HSCons (20 :: Double) HSNil
--   
--   >>> x
--   HSCons (10) (HSCons (20.0) (HSNil))
--   
-- --
--   >>> hget x :: Int
--   10
--   
-- --
--   >>> hget x :: Double
--   20.0
--   
-- -- Note that hget takes specific element from list of uniquely -- typed elements depending on what type is required to be returned -- (return type polymorphism) class i ~ (Index e els) => HGet els e i | els i -> e hget :: HGet els e i => HSet els -> e -- | Enables deriving of the fact that e is contained within -- els and it's safe to say that hget can be performed on -- this particular pair. type HGettable els e = HGet els e (Index e els) -- |
--   >>> let y = HSCons (Tagged 10 :: Tagged "x" Int) $ HSCons (Tagged 20 :: Tagged "y" Int) HSNil
--   
--   >>> y
--   HSCons (Tagged 10) (HSCons (Tagged 20) (HSNil))
--   
-- --
--   >>> hgetTagged (Proxy :: Proxy "x") y :: Int
--   10
--   
-- --
--   >>> hgetTagged (Proxy :: Proxy "y") y :: Int
--   20
--   
hgetTagged :: HGettable els (Tagged label e) => proxy label -> HSet els -> e instance ('S i ~ Index e (e1 : els), HGet els e i) => HGet (e1 : els) e ('S i) instance HGet (e : els) e 'Z module Data.HSet.SubHSet -- | Takes subset of some hset, including subset of same elements in -- different order -- --
--   >>> let x = (HSCons "hello" $ HSCons 1234 $ HSCons 12.123 HSNil) :: HSet '[String, Int, Double]
--   
-- --
--   >>> subHSet x :: HSet '[Double, Int]
--   HSCons (12.123) (HSCons (1234) (HSNil))
--   
-- --
--   >>> subHSet x :: HSet '[String, Double]
--   HSCons ("hello") (HSCons (12.123) (HSNil))
--   
-- --
--   >>> subHSet x :: HSet '[Int, String]
--   HSCons (1234) (HSCons ("hello") (HSNil))
--   
class eq ~ TEq els els2 => SubHSet els els2 eq subHSet :: SubHSet els els2 eq => HSet els -> HSet els2 type SubHSettable els1 els2 = SubHSet els1 els2 (TEq els1 els2) -- | Like subHSet but with proxy for convenience -- --
--   >>> let x = (HSCons "hello" $ HSCons 123 $ HSCons 345 HSNil) :: HSet '[String, Int, Integer]
--   
-- --
--   >>> hnarrow (Proxy :: Proxy '[]) x
--   HSNil
--   
-- --
--   >>> hnarrow (Proxy :: Proxy '[String]) x
--   HSCons ("hello") (HSNil)
--   
-- --
--   >>> hnarrow (Proxy :: Proxy '[Int, Integer]) x
--   HSCons (123) (HSCons (345) (HSNil))
--   
-- --
--   >>> hnarrow (Proxy :: Proxy '[Integer, Int]) x
--   HSCons (345) (HSCons (123) (HSNil))
--   
hnarrow :: SubHSettable els subels => proxy subels -> HSet els -> HSet subels instance (HGettable els el, 'False ~ Elem el els2, SubHSet els els2 subeq, els ~ (el : els2), 'True ~ TEq els (el : els2)) => SubHSet els (el : els2) 'True instance (HGettable els el, 'False ~ Elem el els2, SubHSet els els2 subeq, 'False ~ TEq els (el : els2)) => SubHSet els (el : els2) 'False instance eq ~ TEq els '[] => SubHSet els '[] eq module Data.HSet