-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Primitive list with elements of unique types. -- -- Primitive list with elements of unique types. @package hset @version 2.2.0 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 GHC.Show.Show (Data.HSet.Type.HSet '[]) instance (GHC.Show.Show e, GHC.Show.Show (Data.HSet.Type.HSet els)) => GHC.Show.Show (Data.HSet.Type.HSet (e : els)) instance GHC.Classes.Eq (Data.HSet.Type.HSet '[]) instance (GHC.Classes.Eq e, GHC.Classes.Eq (Data.HSet.Type.HSet els)) => GHC.Classes.Eq (Data.HSet.Type.HSet (e : els)) instance GHC.Classes.Ord (Data.HSet.Type.HSet '[]) instance (GHC.Classes.Ord e, GHC.Classes.Ord (Data.HSet.Type.HSet els)) => GHC.Classes.Ord (Data.HSet.Type.HSet (e : els)) instance Control.DeepSeq.NFData (Data.HSet.Type.HSet '[]) instance (Control.DeepSeq.NFData e, Control.DeepSeq.NFData (Data.HSet.Type.HSet els)) => Control.DeepSeq.NFData (Data.HSet.Type.HSet (e : els)) 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 Data.HSet.Reverse.HReverse acc '[] acc instance (TypeFun.Data.List.NotElem e (ah : at), Data.HSet.Reverse.HReverse (e : ah : at) els1 els2) => Data.HSet.Reverse.HReverse (ah : at) (e : els1) els2 instance Data.HSet.Reverse.HReverse '[e] els1 els2 => Data.HSet.Reverse.HReverse '[] (e : els1) els2 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 (IndexOf e els1) -- | Delete specific element from els1 and returns HSet with els2 hdelete :: (HDeletable e els1 els2) => proxy e -> HSet els1 -> HSet els2 instance Data.HSet.Remove.HRemove (e : els) els 'TypeFun.Data.Peano.Z instance (TypeFun.Data.List.NotElem e els2, Data.HSet.Remove.HRemove els1 els2 i) => Data.HSet.Remove.HRemove (e : els1) (e : els2) ('TypeFun.Data.Peano.S i) 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 Data.HSet.Union.HUnion '[] '[] '[] 'GHC.Base.Nothing 'GHC.Base.Nothing instance Data.HSet.Union.HUnion '[] (e : els) (e : els) 'GHC.Base.Nothing 'GHC.Base.Nothing instance Data.HSet.Union.HUnion (e : els) '[] (e : els) 'GHC.Base.Nothing 'GHC.Base.Nothing instance (Data.HSet.Union.HUnionable els1 els2 elsr, TypeFun.Data.List.NotElem e1 (e2 : elsr), TypeFun.Data.List.NotElem e2 elsr, 'GHC.Base.Nothing ~ Data.HSet.Union.MayFstIndexSnd (e1 : els1) (e2 : els2), 'GHC.Base.Nothing ~ Data.HSet.Union.MayFstIndexSnd (e2 : els2) (e1 : els1)) => Data.HSet.Union.HUnion (e1 : els1) (e2 : els2) (e1 : e2 : elsr) 'GHC.Base.Nothing 'GHC.Base.Nothing instance (Data.HSet.Union.HUnionable els1 els2 elsr, TypeFun.Data.List.NotElem e elsr) => Data.HSet.Union.HUnion (e : els1) (e : els2) (e : elsr) ('GHC.Base.Just 'TypeFun.Data.Peano.Z) ('GHC.Base.Just 'TypeFun.Data.Peano.Z) instance (Data.HSet.Remove.HRemove els2 elsx fi, Data.HSet.Union.HUnionable els1 elsx elsr, TypeFun.Data.List.NotElem e1 elsr, 'GHC.Base.Just ('TypeFun.Data.Peano.S fi) ~ Data.HSet.Union.MayFstIndexSnd (e1 : els1) (e2 : els2), 'GHC.Base.Just si ~ Data.HSet.Union.MayFstIndexSnd (e2 : els2) (e1 : els1)) => Data.HSet.Union.HUnion (e1 : els1) (e2 : els2) (e1 : elsr) ('GHC.Base.Just ('TypeFun.Data.Peano.S fi)) ('GHC.Base.Just si) instance (Data.HSet.Remove.HRemove els2 elsx fi, Data.HSet.Union.HUnionable els1 elsx elsr, TypeFun.Data.List.NotElem e1 elsr, 'GHC.Base.Just fi ~ Data.HSet.Union.MayFstIndexSnd (e1 : els1) els2, 'GHC.Base.Nothing ~ Data.HSet.Union.MayFstIndexSnd els2 (e1 : els1)) => Data.HSet.Union.HUnion (e1 : els1) els2 (e1 : elsr) ('GHC.Base.Just fi) 'GHC.Base.Nothing instance (Data.HSet.Union.HUnionable els1 els2 elsr, TypeFun.Data.List.NotElem e1 elsr, 'GHC.Base.Nothing ~ Data.HSet.Union.MayFstIndexSnd (e1 : els1) (e2 : els2), 'GHC.Base.Just si ~ Data.HSet.Union.MayFstIndexSnd (e2 : els2) (e1 : els1)) => Data.HSet.Union.HUnion (e1 : els1) (e2 : els2) (e1 : elsr) 'GHC.Base.Nothing ('GHC.Base.Just si) module Data.HSet.Modify class (i ~ (IndexOf e1 els1), i ~ (IndexOf e2 els2)) => HModify els1 els2 e1 e2 i | els1 els2 e2 i -> e1, els1 els2 e1 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 (IndexOf 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 TypeFun.Data.List.NotElem e2 els => Data.HSet.Modify.HModify (e1 : els) (e2 : els) e1 e2 'TypeFun.Data.Peano.Z instance ('TypeFun.Data.Peano.S i ~ TypeFun.Data.List.IndexOf e1 (ex : els1), 'TypeFun.Data.Peano.S i ~ TypeFun.Data.List.IndexOf e2 (ex : els2), Data.HSet.Modify.HModify els1 els2 e1 e2 i, TypeFun.Data.List.NotElem ex els2) => Data.HSet.Modify.HModify (ex : els1) (ex : els2) e1 e2 ('TypeFun.Data.Peano.S i) 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 ~ (IndexOf e els)) => HGet els e i | els i -> e -- | Gets any data from HSet for you 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 (IndexOf e els) -- | Reduces to (HGettable els e1, HGettable els e2, ..) -- |
--   >>> 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 Data.HSet.Get.HGet (e : els) e 'TypeFun.Data.Peano.Z instance ('TypeFun.Data.Peano.S i ~ TypeFun.Data.List.IndexOf e (e1 : els), Data.HSet.Get.HGet els e i) => Data.HSet.Get.HGet (e1 : els) e ('TypeFun.Data.Peano.S i) 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 SubHSet els els2 subHSet :: SubHSet els els2 => HSet els -> HSet els2 type SubHSettable = SubHSet -- | 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 Data.HSet.SubHSet.SubHSet els '[] instance (Data.HSet.Get.HGettable els el, TypeFun.Data.List.NotElem el els2, Data.HSet.SubHSet.SubHSet els els2) => Data.HSet.SubHSet.SubHSet els (el : els2) module Data.HSet