-- 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] :: NotElem elem elems => !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 :: forall proxy. HRemove els1 els2 i => proxy i -> HSet els1 -> HSet els2

-- | Delete element from HSet of specified type
--   
--   <pre>
--   &gt;&gt;&gt; let x = (HSCons "sdf" $ HSCons 123 HSNil) :: HSet '[String, Int]
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; hdelete (Proxy :: Proxy Int) x
--   HSCons ("sdf") (HSNil)
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; hdelete (Proxy :: Proxy String) x
--   HSCons (123) (HSNil)
--   </pre>
--   
--   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 :: forall proxy els1 els2 e. 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.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 <tt>els</tt> contains element of type
--   <tt>e</tt> and can be modified
type HMonoModifiable els e = HModifiable els els e e

-- | Like <a>hmodify</a> but do not change the hset's type
hMonoModify :: HMonoModifiable els e => (e -> e) -> HSet els -> HSet els
hModifyTagged :: forall proxy l els1 els2 e1 e2. HModifiable els1 els2 (Tagged l e1) (Tagged l e2) => proxy l -> (e1 -> e2) -> HSet els1 -> HSet els2
hMonoModifyTagged :: forall proxy l els e. HMonoModifiable els (Tagged l e) => proxy l -> (e -> e) -> HSet els -> HSet els
hUntag :: forall proxy els1 els2 l e. HModifiable els1 els2 (Tagged l e) e => proxy l -> proxy e -> HSet els1 -> HSet els2
hTag :: forall proxy els1 els2 l e. 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 Data.Type.Equality.~ TypeFun.Data.List.IndexOf e1 (ex : els1), 'TypeFun.Data.Peano.S i Data.Type.Equality.~ 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
--   
--   <pre>
--   &gt;&gt;&gt; let x = HSCons (10 :: Int) $ HSCons (20 :: Double) HSNil
--   
--   &gt;&gt;&gt; x
--   HSCons (10) (HSCons (20.0) (HSNil))
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; hget x :: Int
--   10
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; hget x :: Double
--   20.0
--   </pre>
--   
--   Note that <a>hget</a> 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 <tt>e</tt> is contained within
--   <tt>els</tt> and it's safe to say that <a>hget</a> can be performed on
--   this particular pair.
type HGettable els e = HGet els e (IndexOf e els)

-- | Reduces to <b>(HGettable els e1, HGettable els e2, ..)</b>
type family AllHGettable (els :: [k]) (subels :: [k]) :: Constraint

-- | <pre>
--   &gt;&gt;&gt; let y = HSCons (Tagged 10 :: Tagged "x" Int) $ HSCons (Tagged 20 :: Tagged "y" Int) HSNil
--   
--   &gt;&gt;&gt; y
--   HSCons (Tagged 10) (HSCons (Tagged 20) (HSNil))
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; hgetTagged (Proxy :: Proxy "x") y :: Int
--   10
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; hgetTagged (Proxy :: Proxy "y") y :: Int
--   20
--   </pre>
hgetTagged :: forall proxy label e els. 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 Data.Type.Equality.~ 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
--   
--   <pre>
--   &gt;&gt;&gt; let x = (HSCons "hello" $ HSCons 1234 $ HSCons 12.123 HSNil) :: HSet '[String, Int, Double]
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; subHSet x :: HSet '[Double, Int]
--   HSCons (12.123) (HSCons (1234) (HSNil))
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; subHSet x :: HSet '[String, Double]
--   HSCons ("hello") (HSCons (12.123) (HSNil))
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; subHSet x :: HSet '[Int, String]
--   HSCons (1234) (HSCons ("hello") (HSNil))
--   </pre>
class SubHSet els els2
subHSet :: SubHSet els els2 => HSet els -> HSet els2
type SubHSettable = SubHSet

-- | Like <a>subHSet</a> but with proxy for convenience
--   
--   <pre>
--   &gt;&gt;&gt; let x = (HSCons "hello" $ HSCons 123 $ HSCons 345 HSNil) :: HSet '[String, Int, Integer]
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; hnarrow (Proxy :: Proxy '[]) x
--   HSNil
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; hnarrow (Proxy :: Proxy '[String]) x
--   HSCons ("hello") (HSNil)
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; hnarrow (Proxy :: Proxy '[Int, Integer]) x
--   HSCons (123) (HSCons (345) (HSNil))
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; hnarrow (Proxy :: Proxy '[Integer, Int]) x
--   HSCons (345) (HSCons (123) (HSNil))
--   </pre>
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.Union
type family MayFstIndexSnd (ts1 :: [k]) (ts2 :: [k]) :: (Maybe N)
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.HUnionable els1 els2 elsr, TypeFun.Data.List.NotElem e1 (e2 : elsr), TypeFun.Data.List.NotElem e2 elsr, 'GHC.Maybe.Nothing Data.Type.Equality.~ Data.HSet.Union.MayFstIndexSnd (e1 : els1) (e2 : els2), 'GHC.Maybe.Nothing Data.Type.Equality.~ Data.HSet.Union.MayFstIndexSnd (e2 : els2) (e1 : els1)) => Data.HSet.Union.HUnion (e1 : els1) (e2 : els2) (e1 : e2 : elsr) 'GHC.Maybe.Nothing 'GHC.Maybe.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.Maybe.Just 'TypeFun.Data.Peano.Z) ('GHC.Maybe.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.Maybe.Just ('TypeFun.Data.Peano.S fi) Data.Type.Equality.~ Data.HSet.Union.MayFstIndexSnd (e1 : els1) (e2 : els2), 'GHC.Maybe.Just si Data.Type.Equality.~ Data.HSet.Union.MayFstIndexSnd (e2 : els2) (e1 : els1)) => Data.HSet.Union.HUnion (e1 : els1) (e2 : els2) (e1 : elsr) ('GHC.Maybe.Just ('TypeFun.Data.Peano.S fi)) ('GHC.Maybe.Just si)
instance (Data.HSet.Remove.HRemove els2 elsx fi, Data.HSet.Union.HUnionable els1 elsx elsr, TypeFun.Data.List.NotElem e1 elsr, 'GHC.Maybe.Just fi Data.Type.Equality.~ Data.HSet.Union.MayFstIndexSnd (e1 : els1) els2, 'GHC.Maybe.Nothing Data.Type.Equality.~ Data.HSet.Union.MayFstIndexSnd els2 (e1 : els1)) => Data.HSet.Union.HUnion (e1 : els1) els2 (e1 : elsr) ('GHC.Maybe.Just fi) 'GHC.Maybe.Nothing
instance (Data.HSet.Union.HUnionable els1 els2 elsr, TypeFun.Data.List.NotElem e1 elsr, 'GHC.Maybe.Nothing Data.Type.Equality.~ Data.HSet.Union.MayFstIndexSnd (e1 : els1) (e2 : els2), 'GHC.Maybe.Just si Data.Type.Equality.~ Data.HSet.Union.MayFstIndexSnd (e2 : els2) (e1 : els1)) => Data.HSet.Union.HUnion (e1 : els1) (e2 : els2) (e1 : elsr) 'GHC.Maybe.Nothing ('GHC.Maybe.Just si)
instance Data.HSet.Union.HUnion '[] '[] '[] 'GHC.Maybe.Nothing 'GHC.Maybe.Nothing
instance Data.HSet.Union.HUnion '[] (e : els) (e : els) 'GHC.Maybe.Nothing 'GHC.Maybe.Nothing
instance Data.HSet.Union.HUnion (e : els) '[] (e : els) 'GHC.Maybe.Nothing 'GHC.Maybe.Nothing

module Data.HSet
