hset 0.0.1 → 0.0.2
raw patch · 4 files changed
+39/−12 lines, 4 filesdep +mtldep ~basePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: mtl
Dependency ranges changed: base
API changes (from Hackage documentation)
- Data.HSet: instance (i ~ Index e els, 'S i ~ Index e (e1 : els), HGet els e i) => HGet (e1 : els) e ('S i)
- Data.HSet: instance HGet (e : els) e 'Z
+ Data.HSet: instance (i ~ Data.HSet.TypeLevel.Index e els, 'Data.HSet.TypeLevel.S i ~ Data.HSet.TypeLevel.Index e (e1 : els), Data.HSet.HGet els e i) => Data.HSet.HGet (e1 : els) e ('Data.HSet.TypeLevel.S i)
+ Data.HSet: instance Data.HSet.HGet (e : els) e 'Data.HSet.TypeLevel.Z
+ Data.HSet.TypeLevel: S :: Nat -> Nat
+ Data.HSet.TypeLevel: Z :: Nat
+ Data.HSet.TypeLevel: data Nat
- Data.HSet: HSNil :: HSet []
+ Data.HSet: HSNil :: HSet '[]
- Data.HSet: class i ~ (Index e els) => HGet els e i
+ Data.HSet: class (i ~ (Index e els)) => HGet els e i
Files
- CHANGELOG.md +4/−0
- hset.cabal +8/−2
- src/Data/HSet.hs +15/−10
- src/Data/HSet/TypeLevel.hs +12/−0
CHANGELOG.md view
@@ -2,3 +2,7 @@ ## 0.0.1 The first compilable and working version++## 0.0.2+### Added+* Add `hask` to read from MonadReaer
hset.cabal view
@@ -1,5 +1,5 @@ name: hset-version: 0.0.1+version: 0.0.2 synopsis: Primitive heterogenous read-only set license: BSD3 license-file: LICENSE@@ -18,10 +18,16 @@ library default-language: Haskell2010 hs-source-dirs: src+ exposed-modules: Data.HSet+ , Data.HSet.TypeLevel+ build-depends: base >=4.6 && < 5+ , mtl - default-extensions: DataKinds+ default-extensions: ConstraintKinds+ , DataKinds+ , FlexibleContexts , FlexibleInstances , GADTs , KindSignatures
src/Data/HSet.hs view
@@ -3,16 +3,8 @@ , HGet(..) ) where -data Nat = Z | S Nat--type family Elem (typ :: *) (typs :: [*]) :: Bool where- Elem typ '[] = 'False- Elem typ (typ ': typs) = 'True- Elem typ1 (typ2 ': typs) = Elem typ1 typs--type family Index (typ :: *) (typs :: [*]) :: Nat where- Index t (t ': ts) = 'Z- Index t (tt ': ts) = 'S (Index t ts)+import Control.Monad.Reader+import Data.HSet.TypeLevel -- | Heterogeneous set (list) of elements with unique types. Usefull -- with MonadReader@@ -20,6 +12,7 @@ HSNil :: HSet '[] HSCons :: ('False ~ (Elem elem elems)) => elem -> HSet elems -> HSet (elem ': elems) + class (i ~ (Index e els)) => HGet els e i where -- | Get any data from HSet for you hget :: HSet els -> e@@ -30,7 +23,14 @@ instance (i ~ (Index e els), ('S i) ~ (Index e (e1 ': els)), HGet els e i) => HGet (e1 ': els) e ('S i) where hget (HSCons _ els) = hget els +type Contains els e = HGet els e (Index e els) +hask :: (MonadReader (HSet els) m, Contains els e) => m e+hask = do+ h <- ask+ return $ hget h++ ---------------------------------------------------------------- -- Tests: if this is compilable then tests done trollface.jpg -- @@ -52,3 +52,8 @@ funFloat :: Float funFloat = hget fun++this :: (Double, Float)+this =+ let h = (,) <$> hask <*> hask+ in runReader h fun
+ src/Data/HSet/TypeLevel.hs view
@@ -0,0 +1,12 @@+module Data.HSet.TypeLevel where++data Nat = Z | S Nat++type family Elem (typ :: *) (typs :: [*]) :: Bool where+ Elem typ '[] = 'False+ Elem typ (typ ': typs) = 'True+ Elem typ1 (typ2 ': typs) = Elem typ1 typs++type family Index (typ :: *) (typs :: [*]) :: Nat where+ Index t (t ': ts) = 'Z+ Index t (tt ': ts) = 'S (Index t ts)