extensible 0.5 → 0.5.1
raw patch · 22 files changed
+280/−520 lines, 22 filesdep +membershipPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: membership
API changes (from Hackage documentation)
- Data.Extensible.Bits: instance forall k (h :: k -> *) (xs :: [k]) r. (Data.Extensible.Class.Forall (Data.Extensible.Dictionary.Instance1 GHC.Show.Show h) xs, Data.Extensible.Bits.BitFields r h xs) => GHC.Show.Show (Data.Extensible.Bits.BitProd r h xs)
- Data.Extensible.Bits: instance forall k v r (h :: v -> *) (x :: Data.Extensible.Internal.Assoc k v). (Data.Bits.Bits r, Data.Extensible.Bits.FromBits r (h (Data.Extensible.Field.AssocValue x))) => Data.Extensible.Bits.FromBits r (Data.Extensible.Field.Field h x)
- Data.Extensible.Class: Duplicate :: k -> Elaborated k v
- Data.Extensible.Class: Expecting :: v -> Elaborated k v
- Data.Extensible.Class: Missing :: k -> Elaborated k v
- Data.Extensible.Class: class Associate k v xs | k xs -> v
- Data.Extensible.Class: data Elaborated k v
- Data.Extensible.Class: data Membership (xs :: [k]) (x :: k)
- Data.Extensible.Class: instance Data.Extensible.Class.Generate '[]
- Data.Extensible.Class: instance forall a (c :: a -> GHC.Types.Constraint) (x :: a) (xs :: [a]). (c x, Data.Extensible.Class.Forall c xs) => Data.Extensible.Class.Forall c (x : xs)
- Data.Extensible.Class: instance forall k (c :: k -> GHC.Types.Constraint). Data.Extensible.Class.Forall c '[]
- Data.Extensible.Class: instance forall k (xs :: [k]) (x :: k). Data.Extensible.Class.Generate xs => Data.Extensible.Class.Generate (x : xs)
- Data.Extensible.Class: remember :: forall xs x r. Membership xs x -> (Member xs x => r) -> r
- Data.Extensible.Class: type x ∈ xs = Member xs x
- Data.Extensible.Dictionary: instance forall v (h :: v -> *) (xs :: [Data.Extensible.Internal.Assoc GHC.Types.Symbol v]). Data.Extensible.Class.Forall (Data.Extensible.Field.KeyValue GHC.TypeLits.KnownSymbol (Data.Extensible.Dictionary.Instance1 Data.Aeson.Types.FromJSON.FromJSON h)) xs => Data.Aeson.Types.FromJSON.FromJSON (Data.Extensible.Field.Field h Data.Extensible.Struct.:* xs)
- Data.Extensible.Dictionary: instance forall v (h :: v -> *) (xs :: [Data.Extensible.Internal.Assoc GHC.Types.Symbol v]). Data.Extensible.Class.Forall (Data.Extensible.Field.KeyValue GHC.TypeLits.KnownSymbol (Data.Extensible.Dictionary.Instance1 Data.Aeson.Types.FromJSON.FromJSON h)) xs => Data.Aeson.Types.FromJSON.FromJSON (Data.Extensible.Nullable.Nullable (Data.Extensible.Field.Field h) Data.Extensible.Struct.:* xs)
- Data.Extensible.Dictionary: instance forall v (h :: v -> *) (xs :: [Data.Extensible.Internal.Assoc GHC.Types.Symbol v]). Data.Extensible.Class.Forall (Data.Extensible.Field.KeyValue GHC.TypeLits.KnownSymbol (Data.Extensible.Dictionary.Instance1 Data.Aeson.Types.ToJSON.ToJSON h)) xs => Data.Aeson.Types.ToJSON.ToJSON (Data.Extensible.Field.Field h Data.Extensible.Struct.:* xs)
- Data.Extensible.Dictionary: instance forall v (h :: v -> *) (xs :: [Data.Extensible.Internal.Assoc GHC.Types.Symbol v]). Data.Extensible.Class.Forall (Data.Extensible.Field.KeyValue GHC.TypeLits.KnownSymbol (Data.Extensible.Dictionary.Instance1 Data.Aeson.Types.ToJSON.ToJSON h)) xs => Data.Aeson.Types.ToJSON.ToJSON (Data.Extensible.Nullable.Nullable (Data.Extensible.Field.Field h) Data.Extensible.Struct.:* xs)
- Data.Extensible.Dictionary: instance forall v (h :: v -> *) (xs :: [Data.Extensible.Internal.Assoc GHC.Types.Symbol v]). Data.Extensible.Class.Forall (Data.Extensible.Field.KeyValue GHC.TypeLits.KnownSymbol (Data.Extensible.Dictionary.Instance1 Data.Csv.Conversion.FromField h)) xs => Data.Csv.Conversion.FromNamedRecord (Data.Extensible.Field.Field h Data.Extensible.Struct.:* xs)
- Data.Extensible.Dictionary: instance forall v (h :: v -> *) (xs :: [Data.Extensible.Internal.Assoc GHC.Types.Symbol v]). Data.Extensible.Class.Forall (Data.Extensible.Field.KeyValue GHC.TypeLits.KnownSymbol (Data.Extensible.Dictionary.Instance1 Data.Csv.Conversion.ToField h)) xs => Data.Csv.Conversion.ToNamedRecord (Data.Extensible.Field.Field h Data.Extensible.Struct.:* xs)
- Data.Extensible.Effect.Default: instance (Control.Monad.Catch.MonadCatch m, Data.Extensible.Internal.Associate "IO" m xs) => Control.Monad.Catch.MonadCatch (Data.Extensible.Effect.Eff xs)
- Data.Extensible.Effect.Default: instance (Control.Monad.Catch.MonadThrow m, Data.Extensible.Internal.Associate "IO" m xs) => Control.Monad.Catch.MonadThrow (Data.Extensible.Effect.Eff xs)
- Data.Extensible.Effect.Default: instance (Control.Monad.IO.Class.MonadIO m, Data.Extensible.Internal.Associate "IO" m xs) => Control.Monad.IO.Class.MonadIO (Data.Extensible.Effect.Eff xs)
- Data.Extensible.Effect.Default: instance (Control.Monad.Trans.Resource.Internal.MonadResource m, Data.Extensible.Internal.Associate "IO" m xs) => Control.Monad.Trans.Resource.Internal.MonadResource (Data.Extensible.Effect.Eff xs)
- Data.Extensible.Effect.Default: instance (GHC.Base.Monoid e, Data.Extensible.Internal.Associate "Either" (Data.Functor.Const.Const e) xs) => GHC.Base.Alternative (Data.Extensible.Effect.Eff xs)
- Data.Extensible.Effect.Default: instance (GHC.Base.Monoid e, Data.Extensible.Internal.Associate "Either" (Data.Functor.Const.Const e) xs) => GHC.Base.MonadPlus (Data.Extensible.Effect.Eff xs)
- Data.Extensible.Effect.Default: instance (GHC.Base.Monoid w, Data.Extensible.Internal.Associate "Writer" ((,) w) xs) => Control.Monad.Writer.Class.MonadWriter w (Data.Extensible.Effect.Eff xs)
- Data.Extensible.Effect.Default: instance Data.Extensible.Internal.Associate "Either" (Data.Functor.Const.Const e) xs => Control.Monad.Error.Class.MonadError e (Data.Extensible.Effect.Eff xs)
- Data.Extensible.Effect.Default: instance Data.Extensible.Internal.Associate "Reader" ((Data.Type.Equality.:~:) r) xs => Control.Monad.Reader.Class.MonadReader r (Data.Extensible.Effect.Eff xs)
- Data.Extensible.Effect.Default: instance Data.Extensible.Internal.Associate "State" (Control.Monad.Trans.State.Strict.State s) xs => Control.Monad.State.Class.MonadState s (Data.Extensible.Effect.Eff xs)
- Data.Extensible.Field: class (pk (AssocKey kv), pv (AssocValue kv)) => KeyValue pk pv kv
- Data.Extensible.Field: class (pv (AssocValue kv)) => ValueIs pv kv
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). Control.DeepSeq.NFData (h (Data.Extensible.Field.AssocValue kv)) => Control.DeepSeq.NFData (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). Data.Aeson.Types.FromJSON.FromJSON (h (Data.Extensible.Field.AssocValue kv)) => Data.Aeson.Types.FromJSON.FromJSON (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). Data.Aeson.Types.ToJSON.ToJSON (h (Data.Extensible.Field.AssocValue kv)) => Data.Aeson.Types.ToJSON.ToJSON (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). Data.Csv.Conversion.FromField (h (Data.Extensible.Field.AssocValue kv)) => Data.Csv.Conversion.FromField (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). Data.Csv.Conversion.ToField (h (Data.Extensible.Field.AssocValue kv)) => Data.Csv.Conversion.ToField (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). Data.Hashable.Class.Hashable (h (Data.Extensible.Field.AssocValue kv)) => Data.Hashable.Class.Hashable (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). Foreign.Storable.Storable (h (Data.Extensible.Field.AssocValue kv)) => Foreign.Storable.Storable (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). GHC.Base.Monoid (h (Data.Extensible.Field.AssocValue kv)) => GHC.Base.Monoid (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). GHC.Base.Semigroup (h (Data.Extensible.Field.AssocValue kv)) => GHC.Base.Semigroup (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). GHC.Classes.Eq (h (Data.Extensible.Field.AssocValue kv)) => GHC.Classes.Eq (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). GHC.Classes.Ord (h (Data.Extensible.Field.AssocValue kv)) => GHC.Classes.Ord (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). GHC.Enum.Bounded (h (Data.Extensible.Field.AssocValue kv)) => GHC.Enum.Bounded (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). GHC.Enum.Enum (h (Data.Extensible.Field.AssocValue kv)) => GHC.Enum.Enum (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). GHC.Float.Floating (h (Data.Extensible.Field.AssocValue kv)) => GHC.Float.Floating (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). GHC.Float.RealFloat (h (Data.Extensible.Field.AssocValue kv)) => GHC.Float.RealFloat (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). GHC.Num.Num (h (Data.Extensible.Field.AssocValue kv)) => GHC.Num.Num (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). GHC.Real.Fractional (h (Data.Extensible.Field.AssocValue kv)) => GHC.Real.Fractional (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). GHC.Real.Integral (h (Data.Extensible.Field.AssocValue kv)) => GHC.Real.Integral (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). GHC.Real.Real (h (Data.Extensible.Field.AssocValue kv)) => GHC.Real.Real (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). GHC.Real.RealFrac (h (Data.Extensible.Field.AssocValue kv)) => GHC.Real.RealFrac (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Data.Extensible.Internal.Assoc k v). Test.QuickCheck.Arbitrary.Arbitrary (h (Data.Extensible.Field.AssocValue kv)) => Test.QuickCheck.Arbitrary.Arbitrary (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (x :: Data.Extensible.Internal.Assoc k v). Data.Vector.Unboxed.Base.Unbox (h (Data.Extensible.Field.AssocValue x)) => Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector (Data.Extensible.Field.Field h x)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (x :: Data.Extensible.Internal.Assoc k v). Data.Vector.Unboxed.Base.Unbox (h (Data.Extensible.Field.AssocValue x)) => Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector (Data.Extensible.Field.Field h x)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (x :: Data.Extensible.Internal.Assoc k v). Data.Vector.Unboxed.Base.Unbox (h (Data.Extensible.Field.AssocValue x)) => Data.Vector.Unboxed.Base.Unbox (Data.Extensible.Field.Field h x)
- Data.Extensible.Field: instance forall k v (h :: v -> *) (x :: Data.Extensible.Internal.Assoc k v). Language.Haskell.TH.Syntax.Lift (h (Data.Extensible.Field.AssocValue x)) => Language.Haskell.TH.Syntax.Lift (Data.Extensible.Field.Field h x)
- Data.Extensible.Field: instance forall k1 v1 (pv :: v1 -> GHC.Types.Constraint) (v2 :: v1) (k2 :: k1). pv v2 => Data.Extensible.Field.ValueIs pv (k2 'Data.Extensible.Internal.:> v2)
- Data.Extensible.Field: instance forall v (h :: v -> *) k (kv :: Data.Extensible.Internal.Assoc k v). GHC.Generics.Generic (Data.Extensible.Field.Field h kv)
- Data.Extensible.Field: instance forall v1 (k :: GHC.Types.Symbol) (h :: v1 -> *) (v2 :: v1). (GHC.TypeLits.KnownSymbol k, Data.Extensible.Wrapper.Wrapper h, GHC.Show.Show (Data.Extensible.Wrapper.Repr h v2)) => GHC.Show.Show (Data.Extensible.Field.Field h (k 'Data.Extensible.Internal.:> v2))
- Data.Extensible.Field: instance forall v1 (k :: GHC.Types.Symbol) (h :: v1 -> *) (v2 :: v1). (GHC.TypeLits.KnownSymbol k, Data.Text.Prettyprint.Doc.Internal.Pretty (h v2)) => Data.Text.Prettyprint.Doc.Internal.Pretty (Data.Extensible.Field.Field h (k 'Data.Extensible.Internal.:> v2))
- Data.Extensible.Field: instance forall v1 k1 (pk :: k1 -> GHC.Types.Constraint) (k2 :: k1) (pv :: v1 -> GHC.Types.Constraint) (v2 :: v1). (pk k2, pv v2) => Data.Extensible.Field.KeyValue pk pv (k2 'Data.Extensible.Internal.:> v2)
- Data.Extensible.Field: instance forall v1 k1 (pk :: k1 -> GHC.Types.Constraint) (k2 :: k1) (v2 :: v1). pk k2 => Data.Extensible.Field.KeyIs pk (k2 'Data.Extensible.Internal.:> v2)
- Data.Extensible.HList: [HCons] :: h x -> HList h xs -> HList h (x : xs)
- Data.Extensible.HList: [HNil] :: HList h '[]
- Data.Extensible.HList: data HList (h :: k -> *) (xs :: [k])
- Data.Extensible.HList: hfoldrWithIndex :: forall h r xs. (forall x. Membership xs x -> h x -> r -> r) -> r -> HList h xs -> r
- Data.Extensible.HList: hlength :: HList h xs -> Int
- Data.Extensible.HList: htraverse :: Applicative f => (forall x. g x -> f (h x)) -> HList g xs -> f (HList h xs)
- Data.Extensible.HList: htraverseWithIndex :: forall f g h xs. Applicative f => (forall x. Membership xs x -> g x -> f (h x)) -> HList g xs -> f (HList h xs)
- Data.Extensible.HList: infixr 5 `HCons`
- Data.Extensible.Inclusion: instance forall k1 v1 (xs :: [Data.Extensible.Internal.Assoc k1 v1]) (t :: Data.Extensible.Internal.Assoc k1 v1) (k2 :: k1) (v2 :: v1). (Data.Extensible.Inclusion.Associated' xs t, t Data.Type.Equality.~ (k2 'Data.Extensible.Internal.:> v2)) => Data.Extensible.Inclusion.Associated xs t
- Data.Extensible.Internal: (:>) :: k -> v -> Assoc k v
- Data.Extensible.Internal: Duplicate :: k -> Elaborated k v
- Data.Extensible.Internal: Expecting :: v -> Elaborated k v
- Data.Extensible.Internal: Missing :: k -> Elaborated k v
- Data.Extensible.Internal: association :: Associate k v xs => Membership xs (k :> v)
- Data.Extensible.Internal: class Associate k v xs | k xs -> v
- Data.Extensible.Internal: class Member xs x
- Data.Extensible.Internal: compareMembership :: Membership xs x -> Membership xs y -> Either Ordering (x :~: y)
- Data.Extensible.Internal: data Assoc k v
- Data.Extensible.Internal: data Elaborated k v
- Data.Extensible.Internal: data Membership (xs :: [k]) (x :: k)
- Data.Extensible.Internal: getMemberId :: Membership xs x -> Int
- Data.Extensible.Internal: here :: Membership (x : xs) x
- Data.Extensible.Internal: impossibleMembership :: Membership '[] x -> r
- Data.Extensible.Internal: infix 0 :>
- Data.Extensible.Internal: instance forall k (x :: k) (xs :: [k]) (pos :: GHC.Types.Nat). (Data.Extensible.Internal.Elaborate x (Data.Extensible.Internal.FindType x xs) Data.Type.Equality.~ 'Data.Extensible.Internal.Expecting pos, GHC.TypeNats.KnownNat pos) => Data.Extensible.Internal.Member xs x
- Data.Extensible.Internal: instance forall k (xs :: [k]) (x :: k). Control.DeepSeq.NFData (Data.Extensible.Internal.Membership xs x)
- Data.Extensible.Internal: instance forall k (xs :: [k]) (x :: k). Data.Hashable.Class.Hashable (Data.Extensible.Internal.Membership xs x)
- Data.Extensible.Internal: instance forall k (xs :: [k]) (x :: k). Data.Text.Prettyprint.Doc.Internal.Pretty (Data.Extensible.Internal.Membership xs x)
- Data.Extensible.Internal: instance forall k (xs :: [k]) (x :: k). GHC.Base.Semigroup (Data.Extensible.Internal.Membership xs x)
- Data.Extensible.Internal: instance forall k (xs :: [k]) (x :: k). GHC.Classes.Eq (Data.Extensible.Internal.Membership xs x)
- Data.Extensible.Internal: instance forall k (xs :: [k]) (x :: k). GHC.Classes.Ord (Data.Extensible.Internal.Membership xs x)
- Data.Extensible.Internal: instance forall k (xs :: [k]) (x :: k). GHC.Show.Show (Data.Extensible.Internal.Membership xs x)
- Data.Extensible.Internal: instance forall k (xs :: [k]) (x :: k). Language.Haskell.TH.Syntax.Lift (Data.Extensible.Internal.Membership xs x)
- Data.Extensible.Internal: instance forall v1 k1 (k2 :: k1) (xs :: [Data.Extensible.Internal.Assoc k1 v1]) (n :: GHC.Types.Nat) (v2 :: v1). (Data.Extensible.Internal.Elaborate k2 (Data.Extensible.Internal.FindAssoc 0 k2 xs) Data.Type.Equality.~ 'Data.Extensible.Internal.Expecting (n 'Data.Extensible.Internal.:> v2), GHC.TypeNats.KnownNat n) => Data.Extensible.Internal.Associate k2 v2 xs
- Data.Extensible.Internal: leadership :: Membership (y : xs) x -> ((x :~: y) -> r) -> (Membership xs x -> r) -> r
- Data.Extensible.Internal: membership :: Member xs x => Membership xs x
- Data.Extensible.Internal: mkMembership :: Int -> Q Exp
- Data.Extensible.Internal: navNext :: Membership xs y -> Membership (x : xs) y
- Data.Extensible.Internal: reifyMembership :: Int -> (forall x. Membership xs x -> r) -> r
- Data.Extensible.Internal: remember :: forall xs x r. Membership xs x -> (Member xs x => r) -> r
- Data.Extensible.Internal: type (>:) = '(:>)
- Data.Extensible.Internal: type family Last (x :: [k]) :: k
- Data.Extensible.Internal: type x ∈ xs = Member xs x
- Data.Extensible.Label: instance forall v1 (f :: * -> *) (p :: * -> * -> *) (e :: (Data.Extensible.Internal.Assoc GHC.Types.Symbol v1 -> *) -> [Data.Extensible.Internal.Assoc GHC.Types.Symbol v1] -> *) (k :: GHC.Types.Symbol) (v2 :: v1) (xs :: [Data.Extensible.Internal.Assoc GHC.Types.Symbol v1]) (h :: v1 -> *) rep s t rep'. (Data.Extensible.Class.Extensible f p e, Data.Extensible.Internal.Associate k v2 xs, Data.Extensible.Field.Labelling k p, Data.Extensible.Wrapper.Wrapper h, Data.Extensible.Class.ExtensibleConstr e (Data.Extensible.Field.Field h) xs (k 'Data.Extensible.Internal.:> v2), rep Data.Type.Equality.~ Data.Extensible.Wrapper.Repr h v2, s Data.Type.Equality.~ e (Data.Extensible.Field.Field h) xs, s Data.Type.Equality.~ t, rep Data.Type.Equality.~ rep') => GHC.OverloadedLabels.IsLabel k (p rep (f rep') -> p s (f t))
- Data.Extensible.Sum: instance forall k (xs :: [k]). (Data.Extensible.Internal.Last xs Data.Extensible.Internal.∈ xs) => GHC.Enum.Bounded (Data.Proxy.Proxy Data.Extensible.Sum.:| xs)
+ Data.Extensible.Bits: instance forall k (h :: k -> *) (xs :: [k]) r. (Type.Membership.Forall (Data.Extensible.Dictionary.Instance1 GHC.Show.Show h) xs, Data.Extensible.Bits.BitFields r h xs) => GHC.Show.Show (Data.Extensible.Bits.BitProd r h xs)
+ Data.Extensible.Bits: instance forall k v r (h :: v -> *) (x :: Type.Membership.Internal.Assoc k v). (Data.Bits.Bits r, Data.Extensible.Bits.FromBits r (h (Type.Membership.TargetOf x))) => Data.Extensible.Bits.FromBits r (Data.Extensible.Field.Field h x)
+ Data.Extensible.Class: class Lookup (xs :: [Assoc k v]) (k1 :: k) (v1 :: v) | k1 xs -> v1
+ Data.Extensible.Class: data Membership (xs :: [k]) (x :: k) :: forall k. () => [k] -> k -> Type
+ Data.Extensible.Class: type Associate k v xs = Lookup xs k v
+ Data.Extensible.Dictionary: instance forall v (h :: v -> *) (xs :: [Type.Membership.Internal.Assoc GHC.Types.Symbol v]). Type.Membership.Forall (Type.Membership.KeyTargetAre GHC.TypeLits.KnownSymbol (Data.Extensible.Dictionary.Instance1 Data.Aeson.Types.FromJSON.FromJSON h)) xs => Data.Aeson.Types.FromJSON.FromJSON (Data.Extensible.Field.Field h Data.Extensible.Struct.:* xs)
+ Data.Extensible.Dictionary: instance forall v (h :: v -> *) (xs :: [Type.Membership.Internal.Assoc GHC.Types.Symbol v]). Type.Membership.Forall (Type.Membership.KeyTargetAre GHC.TypeLits.KnownSymbol (Data.Extensible.Dictionary.Instance1 Data.Aeson.Types.FromJSON.FromJSON h)) xs => Data.Aeson.Types.FromJSON.FromJSON (Data.Extensible.Nullable.Nullable (Data.Extensible.Field.Field h) Data.Extensible.Struct.:* xs)
+ Data.Extensible.Dictionary: instance forall v (h :: v -> *) (xs :: [Type.Membership.Internal.Assoc GHC.Types.Symbol v]). Type.Membership.Forall (Type.Membership.KeyTargetAre GHC.TypeLits.KnownSymbol (Data.Extensible.Dictionary.Instance1 Data.Aeson.Types.ToJSON.ToJSON h)) xs => Data.Aeson.Types.ToJSON.ToJSON (Data.Extensible.Field.Field h Data.Extensible.Struct.:* xs)
+ Data.Extensible.Dictionary: instance forall v (h :: v -> *) (xs :: [Type.Membership.Internal.Assoc GHC.Types.Symbol v]). Type.Membership.Forall (Type.Membership.KeyTargetAre GHC.TypeLits.KnownSymbol (Data.Extensible.Dictionary.Instance1 Data.Aeson.Types.ToJSON.ToJSON h)) xs => Data.Aeson.Types.ToJSON.ToJSON (Data.Extensible.Nullable.Nullable (Data.Extensible.Field.Field h) Data.Extensible.Struct.:* xs)
+ Data.Extensible.Dictionary: instance forall v (h :: v -> *) (xs :: [Type.Membership.Internal.Assoc GHC.Types.Symbol v]). Type.Membership.Forall (Type.Membership.KeyTargetAre GHC.TypeLits.KnownSymbol (Data.Extensible.Dictionary.Instance1 Data.Csv.Conversion.FromField h)) xs => Data.Csv.Conversion.FromNamedRecord (Data.Extensible.Field.Field h Data.Extensible.Struct.:* xs)
+ Data.Extensible.Dictionary: instance forall v (h :: v -> *) (xs :: [Type.Membership.Internal.Assoc GHC.Types.Symbol v]). Type.Membership.Forall (Type.Membership.KeyTargetAre GHC.TypeLits.KnownSymbol (Data.Extensible.Dictionary.Instance1 Data.Csv.Conversion.ToField h)) xs => Data.Csv.Conversion.ToNamedRecord (Data.Extensible.Field.Field h Data.Extensible.Struct.:* xs)
+ Data.Extensible.Effect.Default: instance (Control.Monad.Catch.MonadCatch m, Type.Membership.Internal.Lookup xs "IO" m) => Control.Monad.Catch.MonadCatch (Data.Extensible.Effect.Eff xs)
+ Data.Extensible.Effect.Default: instance (Control.Monad.Catch.MonadThrow m, Type.Membership.Internal.Lookup xs "IO" m) => Control.Monad.Catch.MonadThrow (Data.Extensible.Effect.Eff xs)
+ Data.Extensible.Effect.Default: instance (Control.Monad.IO.Class.MonadIO m, Type.Membership.Internal.Lookup xs "IO" m) => Control.Monad.IO.Class.MonadIO (Data.Extensible.Effect.Eff xs)
+ Data.Extensible.Effect.Default: instance (Control.Monad.Trans.Resource.Internal.MonadResource m, Type.Membership.Internal.Lookup xs "IO" m) => Control.Monad.Trans.Resource.Internal.MonadResource (Data.Extensible.Effect.Eff xs)
+ Data.Extensible.Effect.Default: instance (GHC.Base.Monoid e, Type.Membership.Internal.Lookup xs "Either" (Data.Functor.Const.Const e)) => GHC.Base.Alternative (Data.Extensible.Effect.Eff xs)
+ Data.Extensible.Effect.Default: instance (GHC.Base.Monoid e, Type.Membership.Internal.Lookup xs "Either" (Data.Functor.Const.Const e)) => GHC.Base.MonadPlus (Data.Extensible.Effect.Eff xs)
+ Data.Extensible.Effect.Default: instance (GHC.Base.Monoid w, Type.Membership.Internal.Lookup xs "Writer" ((,) w)) => Control.Monad.Writer.Class.MonadWriter w (Data.Extensible.Effect.Eff xs)
+ Data.Extensible.Effect.Default: instance Type.Membership.Internal.Lookup xs "Either" (Data.Functor.Const.Const e) => Control.Monad.Error.Class.MonadError e (Data.Extensible.Effect.Eff xs)
+ Data.Extensible.Effect.Default: instance Type.Membership.Internal.Lookup xs "Reader" ((Data.Type.Equality.:~:) r) => Control.Monad.Reader.Class.MonadReader r (Data.Extensible.Effect.Eff xs)
+ Data.Extensible.Effect.Default: instance Type.Membership.Internal.Lookup xs "State" (Control.Monad.Trans.State.Strict.State s) => Control.Monad.State.Class.MonadState s (Data.Extensible.Effect.Eff xs)
+ Data.Extensible.Field: class (pk KeyOf kv, pv TargetOf kv) => KeyTargetAre (pk :: k -> Constraint) (pv :: k1 -> Constraint) (kv :: Assoc k k1)
+ Data.Extensible.Field: class pv TargetOf kv => TargetIs (pv :: k1 -> Constraint) (kv :: Assoc k k1)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). Control.DeepSeq.NFData (h (Type.Membership.TargetOf kv)) => Control.DeepSeq.NFData (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). Data.Aeson.Types.FromJSON.FromJSON (h (Type.Membership.TargetOf kv)) => Data.Aeson.Types.FromJSON.FromJSON (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). Data.Aeson.Types.ToJSON.ToJSON (h (Type.Membership.TargetOf kv)) => Data.Aeson.Types.ToJSON.ToJSON (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). Data.Csv.Conversion.FromField (h (Type.Membership.TargetOf kv)) => Data.Csv.Conversion.FromField (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). Data.Csv.Conversion.ToField (h (Type.Membership.TargetOf kv)) => Data.Csv.Conversion.ToField (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). Data.Hashable.Class.Hashable (h (Type.Membership.TargetOf kv)) => Data.Hashable.Class.Hashable (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). Foreign.Storable.Storable (h (Type.Membership.TargetOf kv)) => Foreign.Storable.Storable (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). GHC.Base.Monoid (h (Type.Membership.TargetOf kv)) => GHC.Base.Monoid (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). GHC.Base.Semigroup (h (Type.Membership.TargetOf kv)) => GHC.Base.Semigroup (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). GHC.Classes.Eq (h (Type.Membership.TargetOf kv)) => GHC.Classes.Eq (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). GHC.Classes.Ord (h (Type.Membership.TargetOf kv)) => GHC.Classes.Ord (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). GHC.Enum.Bounded (h (Type.Membership.TargetOf kv)) => GHC.Enum.Bounded (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). GHC.Enum.Enum (h (Type.Membership.TargetOf kv)) => GHC.Enum.Enum (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). GHC.Float.Floating (h (Type.Membership.TargetOf kv)) => GHC.Float.Floating (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). GHC.Float.RealFloat (h (Type.Membership.TargetOf kv)) => GHC.Float.RealFloat (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). GHC.Num.Num (h (Type.Membership.TargetOf kv)) => GHC.Num.Num (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). GHC.Real.Fractional (h (Type.Membership.TargetOf kv)) => GHC.Real.Fractional (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). GHC.Real.Integral (h (Type.Membership.TargetOf kv)) => GHC.Real.Integral (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). GHC.Real.Real (h (Type.Membership.TargetOf kv)) => GHC.Real.Real (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). GHC.Real.RealFrac (h (Type.Membership.TargetOf kv)) => GHC.Real.RealFrac (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (kv :: Type.Membership.Internal.Assoc k v). Test.QuickCheck.Arbitrary.Arbitrary (h (Type.Membership.TargetOf kv)) => Test.QuickCheck.Arbitrary.Arbitrary (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (x :: Type.Membership.Internal.Assoc k v). Data.Vector.Unboxed.Base.Unbox (h (Type.Membership.TargetOf x)) => Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector (Data.Extensible.Field.Field h x)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (x :: Type.Membership.Internal.Assoc k v). Data.Vector.Unboxed.Base.Unbox (h (Type.Membership.TargetOf x)) => Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector (Data.Extensible.Field.Field h x)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (x :: Type.Membership.Internal.Assoc k v). Data.Vector.Unboxed.Base.Unbox (h (Type.Membership.TargetOf x)) => Data.Vector.Unboxed.Base.Unbox (Data.Extensible.Field.Field h x)
+ Data.Extensible.Field: instance forall k v (h :: v -> *) (x :: Type.Membership.Internal.Assoc k v). Language.Haskell.TH.Syntax.Lift (h (Type.Membership.TargetOf x)) => Language.Haskell.TH.Syntax.Lift (Data.Extensible.Field.Field h x)
+ Data.Extensible.Field: instance forall v (h :: v -> *) k (kv :: Type.Membership.Internal.Assoc k v). GHC.Generics.Generic (Data.Extensible.Field.Field h kv)
+ Data.Extensible.Field: instance forall v1 (k :: GHC.Types.Symbol) (h :: v1 -> *) (v2 :: v1). (GHC.TypeLits.KnownSymbol k, Data.Extensible.Wrapper.Wrapper h, GHC.Show.Show (Data.Extensible.Wrapper.Repr h v2)) => GHC.Show.Show (Data.Extensible.Field.Field h (k 'Type.Membership.Internal.:> v2))
+ Data.Extensible.Field: instance forall v1 (k :: GHC.Types.Symbol) (h :: v1 -> *) (v2 :: v1). (GHC.TypeLits.KnownSymbol k, Data.Text.Prettyprint.Doc.Internal.Pretty (h v2)) => Data.Text.Prettyprint.Doc.Internal.Pretty (Data.Extensible.Field.Field h (k 'Type.Membership.Internal.:> v2))
+ Data.Extensible.Field: proxyKeyOf :: () => proxy kv -> Proxy (KeyOf kv)
+ Data.Extensible.Field: proxyTargetOf :: () => proxy kv -> Proxy (TargetOf kv)
+ Data.Extensible.Field: stringKeyOf :: (IsString a, KnownSymbol (KeyOf kv)) => proxy kv -> a
+ Data.Extensible.Field: type AssocKey kv = KeyOf kv
+ Data.Extensible.Field: type AssocValue kv = TargetOf kv
+ Data.Extensible.Field: type KeyValue = KeyTargetAre
+ Data.Extensible.Field: type ValueIs = TargetIs
+ Data.Extensible.Inclusion: instance forall k1 v1 (xs :: [Type.Membership.Internal.Assoc k1 v1]) (t :: Type.Membership.Internal.Assoc k1 v1) (k2 :: k1) (v2 :: v1). (Data.Extensible.Inclusion.Associated' xs t, t Data.Type.Equality.~ (k2 'Type.Membership.Internal.:> v2)) => Data.Extensible.Inclusion.Associated xs t
+ Data.Extensible.Label: instance forall v1 (f :: * -> *) (p :: * -> * -> *) (e :: (Type.Membership.Internal.Assoc GHC.Types.Symbol v1 -> *) -> [Type.Membership.Internal.Assoc GHC.Types.Symbol v1] -> *) (xs :: [Type.Membership.Internal.Assoc GHC.Types.Symbol v1]) (k :: GHC.Types.Symbol) (v2 :: v1) (h :: v1 -> *) rep s t rep'. (Data.Extensible.Class.Extensible f p e, Type.Membership.Internal.Lookup xs k v2, Data.Extensible.Field.Labelling k p, Data.Extensible.Wrapper.Wrapper h, Data.Extensible.Class.ExtensibleConstr e (Data.Extensible.Field.Field h) xs (k 'Type.Membership.Internal.:> v2), rep Data.Type.Equality.~ Data.Extensible.Wrapper.Repr h v2, s Data.Type.Equality.~ e (Data.Extensible.Field.Field h) xs, s Data.Type.Equality.~ t, rep Data.Type.Equality.~ rep') => GHC.OverloadedLabels.IsLabel k (p rep (f rep') -> p s (f t))
+ Data.Extensible.Record: instance Data.Extensible.Record.GIsRecord (GHC.Generics.S1 ('GHC.Generics.MetaSel ('GHC.Maybe.Just name) su ss ds) (GHC.Generics.K1 i a)) r
+ Data.Extensible.Record: instance forall k (f :: k -> *) (g :: k -> *) (r :: [Type.Membership.Internal.Assoc GHC.Types.Symbol *]). (Data.Extensible.Record.GIsRecord f (Data.Extensible.Record.GRecFields g r), Data.Extensible.Record.GIsRecord g r) => Data.Extensible.Record.GIsRecord (f GHC.Generics.:*: g) r
+ Data.Extensible.Record: instance forall k (f :: k -> *) (r :: [Type.Membership.Internal.Assoc GHC.Types.Symbol *]) (i :: GHC.Generics.Meta). Data.Extensible.Record.GIsRecord f r => Data.Extensible.Record.GIsRecord (GHC.Generics.C1 i f) r
+ Data.Extensible.Record: instance forall k (f :: k -> *) (r :: [Type.Membership.Internal.Assoc GHC.Types.Symbol *]) (i :: GHC.Generics.Meta). Data.Extensible.Record.GIsRecord f r => Data.Extensible.Record.GIsRecord (GHC.Generics.D1 i f) r
+ Data.Extensible.Record: type RecFields a = GRecFields (Rep a) '[];
+ Data.Extensible.Sum: instance forall k (xs :: [k]). (Data.Extensible.Class.Last xs Type.Membership.Internal.∈ xs) => GHC.Enum.Bounded (Data.Proxy.Proxy Data.Extensible.Sum.:| xs)
- Data.Extensible.Bits: newtype BitProd r (h :: k -> *) (xs :: [k])
+ Data.Extensible.Bits: newtype BitProd r (h :: k -> Type) (xs :: [k])
- Data.Extensible.Class: association :: Associate k v xs => Membership xs (k :> v)
+ Data.Extensible.Class: association :: Lookup xs k1 v1 => Membership xs (k1 :> v1)
- Data.Extensible.Class: class Member xs x
+ Data.Extensible.Class: class Member (xs :: [k]) (x :: k)
- Data.Extensible.Class: compareMembership :: Membership xs x -> Membership xs y -> Either Ordering (x :~: y)
+ Data.Extensible.Class: compareMembership :: () => Membership xs x -> Membership xs y -> Either Ordering (x :~: y)
- Data.Extensible.Class: henumerate :: Generate xs => (forall x. Membership xs x -> r -> r) -> r -> r
+ Data.Extensible.Class: henumerate :: Generate xs => (forall (x :: k). () => Membership xs x -> r -> r) -> r -> r
- Data.Extensible.Class: henumerateFor :: Forall c xs => proxy c -> proxy' xs -> (forall x. c x => Membership xs x -> r -> r) -> r -> r
+ Data.Extensible.Class: henumerateFor :: Forall c xs => proxy c -> proxy' xs -> (forall (x :: k). c x => Membership xs x -> r -> r) -> r -> r
- Data.Extensible.Class: hgenerateList :: (Generate xs, Applicative f) => (forall x. Membership xs x -> f (h x)) -> f (HList h xs)
+ Data.Extensible.Class: hgenerateList :: (Generate xs, Applicative f) => (forall (x :: k). () => Membership xs x -> f (h x)) -> f (HList h xs)
- Data.Extensible.Class: hgenerateListFor :: (Forall c xs, Applicative f) => proxy c -> (forall x. c x => Membership xs x -> f (h x)) -> f (HList h xs)
+ Data.Extensible.Class: hgenerateListFor :: (Forall c xs, Applicative f) => proxy c -> (forall (x :: k). c x => Membership xs x -> f (h x)) -> f (HList h xs)
- Data.Extensible.Class: itemAssoc :: (Wrapper h, Extensible f p t, Associate k v xs, ExtensibleConstr t h xs (k :> v)) => proxy k -> Optic' p f (t h xs) (Repr h (k :> v))
+ Data.Extensible.Class: itemAssoc :: (Wrapper h, Extensible f p t, Lookup xs k v, ExtensibleConstr t h xs (k :> v)) => proxy k -> Optic' p f (t h xs) (Repr h (k :> v))
- Data.Extensible.Class: leadership :: Membership (y : xs) x -> ((x :~: y) -> r) -> (Membership xs x -> r) -> r
+ Data.Extensible.Class: leadership :: () => Membership (x : xs) x
- Data.Extensible.Class: pieceAssoc :: (Associate k v xs, Extensible f p t, ExtensibleConstr t h xs (k :> v)) => Optic' p f (t h xs) (h (k :> v))
+ Data.Extensible.Class: pieceAssoc :: (Lookup xs k v, Extensible f p t, ExtensibleConstr t h xs (k :> v)) => Optic' p f (t h xs) (h (k :> v))
- Data.Extensible.Class: type (>:) = '(:>)
+ Data.Extensible.Class: type (>:) = ((:>) :: k -> v -> Assoc k v)
- Data.Extensible.Class: type family Elaborate (key :: k) (xs :: [v]) :: Elaborated k v
+ Data.Extensible.Class: type family Last (x :: [k]) :: k
- Data.Extensible.Effect: [Instruction] :: !Membership xs kv -> AssocValue kv a -> Instruction xs a
+ Data.Extensible.Effect: [Instruction] :: !Membership xs kv -> TargetOf kv a -> Instruction xs a
- Data.Extensible.Effect: askEff :: forall k r xs. Associate k (ReaderEff r) xs => Proxy k -> Eff xs r
+ Data.Extensible.Effect: askEff :: forall k r xs. Lookup xs k (ReaderEff r) => Proxy k -> Eff xs r
- Data.Extensible.Effect: asksEff :: forall k r xs a. Associate k (ReaderEff r) xs => Proxy k -> (r -> a) -> Eff xs a
+ Data.Extensible.Effect: asksEff :: forall k r xs a. Lookup xs k (ReaderEff r) => Proxy k -> (r -> a) -> Eff xs a
- Data.Extensible.Effect: catchEff :: forall k e xs a. Associate k (EitherEff e) xs => Proxy k -> Eff xs a -> (e -> Eff xs a) -> Eff xs a
+ Data.Extensible.Effect: catchEff :: forall k e xs a. Lookup xs k (EitherEff e) => Proxy k -> Eff xs a -> (e -> Eff xs a) -> Eff xs a
- Data.Extensible.Effect: contEff :: Associate k (ContT r m) xs => Proxy k -> ((a -> m r) -> m r) -> Eff xs a
+ Data.Extensible.Effect: contEff :: Lookup xs k (ContT r m) => Proxy k -> ((a -> m r) -> m r) -> Eff xs a
- Data.Extensible.Effect: getEff :: forall k s xs. Associate k (State s) xs => Proxy k -> Eff xs s
+ Data.Extensible.Effect: getEff :: forall k s xs. Lookup xs k (State s) => Proxy k -> Eff xs s
- Data.Extensible.Effect: getsEff :: forall k s a xs. Associate k (State s) xs => Proxy k -> (s -> a) -> Eff xs a
+ Data.Extensible.Effect: getsEff :: forall k s a xs. Lookup xs k (State s) => Proxy k -> (s -> a) -> Eff xs a
- Data.Extensible.Effect: hoistEff :: forall s t xs a. Associate s t xs => Proxy s -> (forall x. t x -> t x) -> Eff xs a -> Eff xs a
+ Data.Extensible.Effect: hoistEff :: forall s t xs a. Lookup xs s t => Proxy s -> (forall x. t x -> t x) -> Eff xs a -> Eff xs a
- Data.Extensible.Effect: liftEff :: forall s t xs a. Associate s t xs => Proxy s -> t a -> Eff xs a
+ Data.Extensible.Effect: liftEff :: forall s t xs a. Lookup xs s t => Proxy s -> t a -> Eff xs a
- Data.Extensible.Effect: liftsEff :: forall s t xs a r. Associate s t xs => Proxy s -> t a -> (a -> r) -> Eff xs r
+ Data.Extensible.Effect: liftsEff :: forall s t xs a r. Lookup xs s t => Proxy s -> t a -> (a -> r) -> Eff xs r
- Data.Extensible.Effect: listenEff :: forall k w xs a. (Associate k (WriterEff w) xs, Monoid w) => Proxy k -> Eff xs a -> Eff xs (a, w)
+ Data.Extensible.Effect: listenEff :: forall k w xs a. (Lookup xs k (WriterEff w), Monoid w) => Proxy k -> Eff xs a -> Eff xs (a, w)
- Data.Extensible.Effect: localEff :: forall k r xs a. Associate k (ReaderEff r) xs => Proxy k -> (r -> r) -> Eff xs a -> Eff xs a
+ Data.Extensible.Effect: localEff :: forall k r xs a. Lookup xs k (ReaderEff r) => Proxy k -> (r -> r) -> Eff xs a -> Eff xs a
- Data.Extensible.Effect: modifyEff :: forall k s xs. Associate k (State s) xs => Proxy k -> (s -> s) -> Eff xs ()
+ Data.Extensible.Effect: modifyEff :: forall k s xs. Lookup xs k (State s) => Proxy k -> (s -> s) -> Eff xs ()
- Data.Extensible.Effect: nothingEff :: Associate k MaybeEff xs => Proxy k -> Eff xs a
+ Data.Extensible.Effect: nothingEff :: Lookup xs k MaybeEff => Proxy k -> Eff xs a
- Data.Extensible.Effect: passEff :: forall k w xs a. (Associate k (WriterEff w) xs, Monoid w) => Proxy k -> Eff xs (a, w -> w) -> Eff xs a
+ Data.Extensible.Effect: passEff :: forall k w xs a. (Lookup xs k (WriterEff w), Monoid w) => Proxy k -> Eff xs (a, w -> w) -> Eff xs a
- Data.Extensible.Effect: putEff :: forall k s xs. Associate k (State s) xs => Proxy k -> s -> Eff xs ()
+ Data.Extensible.Effect: putEff :: forall k s xs. Lookup xs k (State s) => Proxy k -> s -> Eff xs ()
- Data.Extensible.Effect: stateEff :: forall k s xs a. Associate k (State s) xs => Proxy k -> (s -> (a, s)) -> Eff xs a
+ Data.Extensible.Effect: stateEff :: forall k s xs a. Lookup xs k (State s) => Proxy k -> (s -> (a, s)) -> Eff xs a
- Data.Extensible.Effect: tellEff :: forall k w xs. Associate k (WriterEff w) xs => Proxy k -> w -> Eff xs ()
+ Data.Extensible.Effect: tellEff :: forall k w xs. Lookup xs k (WriterEff w) => Proxy k -> w -> Eff xs ()
- Data.Extensible.Effect: throwEff :: Associate k (EitherEff e) xs => Proxy k -> e -> Eff xs a
+ Data.Extensible.Effect: throwEff :: Lookup xs k (EitherEff e) => Proxy k -> e -> Eff xs a
- Data.Extensible.Effect: tickEff :: Associate k Identity xs => Proxy k -> Eff xs ()
+ Data.Extensible.Effect: tickEff :: Lookup xs k Identity => Proxy k -> Eff xs ()
- Data.Extensible.Effect: writerEff :: forall k w xs a. Associate k (WriterEff w) xs => Proxy k -> (a, w) -> Eff xs a
+ Data.Extensible.Effect: writerEff :: forall k w xs a. Lookup xs k (WriterEff w) => Proxy k -> (a, w) -> Eff xs a
- Data.Extensible.Field: Field :: h (AssocValue kv) -> Field
+ Data.Extensible.Field: Field :: h (TargetOf kv) -> Field
- Data.Extensible.Field: [getField] :: Field -> h (AssocValue kv)
+ Data.Extensible.Field: [getField] :: Field -> h (TargetOf kv)
- Data.Extensible.Field: class (pk (AssocKey kv)) => KeyIs pk kv
+ Data.Extensible.Field: class pk KeyOf kv => KeyIs (pk :: k -> Constraint) (kv :: Assoc k v)
- Data.Extensible.Field: liftField :: (g (AssocValue kv) -> h (AssocValue kv)) -> Field g kv -> Field h kv
+ Data.Extensible.Field: liftField :: (g (TargetOf kv) -> h (TargetOf kv)) -> Field g kv -> Field h kv
- Data.Extensible.Field: liftField2 :: (f (AssocValue kv) -> g (AssocValue kv) -> h (AssocValue kv)) -> Field f kv -> Field g kv -> Field h kv
+ Data.Extensible.Field: liftField2 :: (f (TargetOf kv) -> g (TargetOf kv) -> h (TargetOf kv)) -> Field f kv -> Field g kv -> Field h kv
- Data.Extensible.Field: proxyAssocKey :: proxy kv -> Proxy (AssocKey kv)
+ Data.Extensible.Field: proxyAssocKey :: proxy kv -> Proxy (KeyOf kv)
- Data.Extensible.Field: proxyAssocValue :: proxy kv -> Proxy (AssocValue kv)
+ Data.Extensible.Field: proxyAssocValue :: proxy kv -> Proxy (TargetOf kv)
- Data.Extensible.Field: stringAssocKey :: (IsString a, KnownSymbol (AssocKey kv)) => proxy kv -> a
+ Data.Extensible.Field: stringAssocKey :: (IsString a, KnownSymbol (KeyOf kv)) => proxy kv -> a
- Data.Extensible.Field: type FieldOptic k = forall kind. forall f p t xs (h :: kind -> Type) (v :: kind). (Extensible f p t, ExtensibleConstr t (Field h) xs (k :> v), Associate k v xs, Labelling k p, Wrapper h) => Optic' p f (t (Field h) xs) (Repr h v)
+ Data.Extensible.Field: type FieldOptic k = forall kind. forall f p t xs (h :: kind -> Type) (v :: kind). (Extensible f p t, ExtensibleConstr t (Field h) xs (k :> v), Lookup xs k v, Labelling k p, Wrapper h) => Optic' p f (t (Field h) xs) (Repr h v)
- Data.Extensible.Product: henumerate :: Generate xs => (forall x. Membership xs x -> r -> r) -> r -> r
+ Data.Extensible.Product: henumerate :: Generate xs => (forall (x :: k). () => Membership xs x -> r -> r) -> r -> r
- Data.Extensible.Product: henumerateFor :: Forall c xs => proxy c -> proxy' xs -> (forall x. c x => Membership xs x -> r -> r) -> r -> r
+ Data.Extensible.Product: henumerateFor :: Forall c xs => proxy c -> proxy' xs -> (forall (x :: k). c x => Membership xs x -> r -> r) -> r -> r
- Data.Extensible.Product: hgenerateList :: (Generate xs, Applicative f) => (forall x. Membership xs x -> f (h x)) -> f (HList h xs)
+ Data.Extensible.Product: hgenerateList :: (Generate xs, Applicative f) => (forall (x :: k). () => Membership xs x -> f (h x)) -> f (HList h xs)
- Data.Extensible.Product: hgenerateListFor :: (Forall c xs, Applicative f) => proxy c -> (forall x. c x => Membership xs x -> f (h x)) -> f (HList h xs)
+ Data.Extensible.Product: hgenerateListFor :: (Forall c xs, Applicative f) => proxy c -> (forall (x :: k). c x => Membership xs x -> f (h x)) -> f (HList h xs)
- Data.Extensible.Product: infixr 5 ++
+ Data.Extensible.Product: infixr 5 `happend`
- Data.Extensible.Record: recordFromList :: IsRecord a => HList (Field Identity) (RecFields a) -> a
+ Data.Extensible.Record: recordFromList :: (IsRecord a, Generic a, GIsRecord (Rep a) '[], GRecFields (Rep a) '[] ~ RecFields a) => HList (Field Identity) (RecFields a) -> a
- Data.Extensible.Record: recordToList :: IsRecord a => a -> HList (Field Identity) (RecFields a)
+ Data.Extensible.Record: recordToList :: (IsRecord a, Generic a, GIsRecord (Rep a) '[], GRecFields (Rep a) '[] ~ RecFields a) => a -> HList (Field Identity) (RecFields a)
- Data.Extensible.Struct: (-$>) :: forall k h xs v s. Associate k v xs => Struct s h xs -> Proxy k -> WrappedPointer s h (Repr h (k :> v))
+ Data.Extensible.Struct: (-$>) :: forall k h xs v s. Lookup xs k v => Struct s h xs -> Proxy k -> WrappedPointer s h (Repr h (k :> v))
- Data.Extensible.Struct: infixr 5 ++
+ Data.Extensible.Struct: infixr 5 `happend`
- Data.Extensible.Sum: embedAssoc :: Associate k a xs => h (k :> a) -> h :| xs
+ Data.Extensible.Sum: embedAssoc :: Lookup xs k a => h (k :> a) -> h :| xs
- Data.Extensible.Tangle: lasso :: forall k v m h xs. (Monad m, Associate k v xs, Wrapper h) => FieldName k -> TangleT h xs m (Repr h (k :> v))
+ Data.Extensible.Tangle: lasso :: forall k v m h xs. (Monad m, Lookup xs k v, Wrapper h) => FieldName k -> TangleT h xs m (Repr h (k :> v))
Files
- .travis.yml +58/−63
- CHANGELOG.md +9/−0
- extensible.cabal +3/−4
- src/Data/Extensible/Bits.hs +9/−6
- src/Data/Extensible/Class.hs +18/−57
- src/Data/Extensible/Dictionary.hs +17/−17
- src/Data/Extensible/Effect.hs +29/−31
- src/Data/Extensible/Effect/Default.hs +12/−11
- src/Data/Extensible/Field.hs +52/−55
- src/Data/Extensible/HList.hs +0/−48
- src/Data/Extensible/Inclusion.hs +2/−2
- src/Data/Extensible/Internal.hs +0/−199
- src/Data/Extensible/Label.hs +1/−1
- src/Data/Extensible/Nullable.hs +4/−4
- src/Data/Extensible/Plain.hs +0/−1
- src/Data/Extensible/Product.hs +1/−2
- src/Data/Extensible/Record.hs +49/−2
- src/Data/Extensible/Struct.hs +6/−6
- src/Data/Extensible/Sum.hs +5/−5
- src/Data/Extensible/TH.hs +2/−3
- src/Data/Extensible/Tangle.hs +2/−2
- src/Data/Extensible/Wrapper.hs +1/−1
.travis.yml view
@@ -1,11 +1,13 @@ # This Travis job script has been generated by a script via #-# runghc make_travis_yml_2.hs 'extensible.cabal'+# haskell-ci './extensible.cabal' #-# For more information, see https://github.com/hvr/multi-ghc-travis+# For more information, see https://github.com/haskell-CI/haskell-ci #+# version: 0.2.1+# language: c-sudo: false+dist: xenial git: submodules: false # whether to recursively clone submodules@@ -16,71 +18,59 @@ - $HOME/.cabal/store before_cache:- - rm -fv $HOME/.cabal/packages/hackage.haskell.org/build-reports.log+ - rm -fv $CABALHOME/packages/hackage.haskell.org/build-reports.log # remove files that are regenerated by 'cabal update'- - rm -fv $HOME/.cabal/packages/hackage.haskell.org/00-index.*- - rm -fv $HOME/.cabal/packages/hackage.haskell.org/*.json- - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.cache- - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar- - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar.idx+ - rm -fv $CABALHOME/packages/hackage.haskell.org/00-index.*+ - rm -fv $CABALHOME/packages/hackage.haskell.org/*.json+ - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.cache+ - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar+ - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar.idx - - rm -rfv $HOME/.cabal/packages/head.hackage+ - rm -rfv $CABALHOME/packages/head.hackage matrix: include:- - compiler: "ghc-8.4.4"- env: GHCHEAD=true- addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.4.4], sources: [hvr-ghc]}} - compiler: "ghc-8.6.3"- env: GHCHEAD=true- addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.6.3], sources: [hvr-ghc]}}-+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.4,ghc-8.6.3], sources: [hvr-ghc]}}+ - compiler: "ghc-8.4.4"+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.4,ghc-8.4.4], sources: [hvr-ghc]}} before_install:- - HC=${CC}+ - HC=/opt/ghc/bin/${CC} - HCPKG=${HC/ghc/ghc-pkg} - unset CC+ - CABAL=/opt/ghc/bin/cabal+ - CABALHOME=$HOME/.cabal+ - export PATH="$CABALHOME/bin:$PATH" - ROOTDIR=$(pwd)- - mkdir -p $HOME/.local/bin- - "PATH=/opt/ghc/bin:/opt/ghc-ppa-tools/bin:$HOME/local/bin:$PATH" - HCNUMVER=$(( $(${HC} --numeric-version|sed -E 's/([0-9]+)\.([0-9]+)\.([0-9]+).*/\1 * 10000 + \2 * 100 + \3/') )) - echo $HCNUMVER install:- - cabal --version+ - ${CABAL} --version - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"- - BENCH=${BENCH---enable-benchmarks}- - TEST=${TEST---enable-tests}- - HADDOCK=${HADDOCK-true}- - INSTALLED=${INSTALLED-true}+ - TEST=--enable-tests+ - BENCH=--enable-benchmarks - GHCHEAD=${GHCHEAD-false}- - travis_retry cabal update -v- - "sed -i.bak 's/^jobs:/-- jobs:/' ${HOME}/.cabal/config"+ - travis_retry ${CABAL} update -v+ - sed -i.bak 's/^jobs:/-- jobs:/' $CABALHOME/config - rm -fv cabal.project cabal.project.local- # Overlay Hackage Package Index for GHC HEAD: https://github.com/hvr/head.hackage- - |- if $GHCHEAD; then- sed -i.bak 's/-- allow-newer:.*/allow-newer: *:base, *:template-haskell, *:ghc, *:Cabal/' ${HOME}/.cabal/config-- echo 'repository head.hackage' >> ${HOME}/.cabal/config- echo ' url: http://head.hackage.haskell.org/' >> ${HOME}/.cabal/config- echo ' secure: True' >> ${HOME}/.cabal/config- echo ' root-keys: 07c59cb65787dedfaef5bd5f987ceb5f7e5ebf88b904bbd4c5cbdeb2ff71b740' >> ${HOME}/.cabal/config- echo ' 2e8555dde16ebd8df076f1a8ef13b8f14c66bad8eafefd7d9e37d0ed711821fb' >> ${HOME}/.cabal/config- echo ' 8f79fd2389ab2967354407ec852cbe73f2e8635793ac446d09461ffb99527f6e' >> ${HOME}/.cabal/config- echo ' key-threshold: 3' >> ${HOME}/.cabal.config-- cabal new-update head.hackage -v- fi- - grep -Ev -- '^\s*--' ${HOME}/.cabal/config | grep -Ev '^\s*$'- - "printf 'packages: \".\"\\n' > cabal.project"- - cat cabal.project- - if [ -f "./configure.ac" ]; then- (cd "." && autoreconf -i);- fi+ - grep -Ev -- '^\s*--' $CABALHOME/config | grep -Ev '^\s*$'+ - rm -f cabal.project+ - touch cabal.project+ - "printf 'packages: \".\"\\n' >> cabal.project"+ - "printf 'write-ghc-environment-files: always\\n' >> cabal.project"+ - touch cabal.project.local+ - "for pkg in $($HCPKG list --simple-output); do echo $pkg | sed 's/-[^-]*$//' | grep -vE -- '^(extensible)$' | sed 's/^/constraints: /' | sed 's/$/ installed/' >> cabal.project.local; done"+ - cat cabal.project || true+ - cat cabal.project.local || true+ - if [ -f "./configure.ac" ]; then (cd "." && autoreconf -i); fi - rm -f cabal.project.freeze- - cabal new-build -w ${HC} ${TEST} ${BENCH} --project-file="cabal.project" --dep -j2 all- - cabal new-build -w ${HC} --disable-tests --disable-benchmarks --project-file="cabal.project" --dep -j2 all+ - ${CABAL} new-freeze -w ${HC} ${TEST} ${BENCH} --project-file="cabal.project" --dry+ - "cat \"cabal.project.freeze\" | sed -E 's/^(constraints: *| *)//' | sed 's/any.//'"+ - rm "cabal.project.freeze"+ - ${CABAL} new-build -w ${HC} ${TEST} ${BENCH} --project-file="cabal.project" --dep -j2 all+ - ${CABAL} new-build -w ${HC} --disable-tests --disable-benchmarks --project-file="cabal.project" --dep -j2 all - rm -rf .ghc.environment.* "."/dist - DISTDIR=$(mktemp -d /tmp/dist-test.XXXX) @@ -88,28 +78,33 @@ # any command which exits with a non-zero exit code causes the build to fail. script: # test that source-distributions can be generated- - (cd "." && cabal sdist)- - mv "."/dist/extensible-*.tar.gz ${DISTDIR}/+ - ${CABAL} new-sdist all+ - mv dist-newstyle/sdist/*.tar.gz ${DISTDIR}/ - cd ${DISTDIR} || false - find . -maxdepth 1 -name '*.tar.gz' -exec tar -xvf '{}' \;- - "printf 'packages: extensible-*/*.cabal\\n' > cabal.project"- - cat cabal.project+ - rm -f cabal.project+ - touch cabal.project+ - "printf 'packages: \"extensible-*/*.cabal\"\\n' >> cabal.project"+ - "printf 'write-ghc-environment-files: always\\n' >> cabal.project"+ - touch cabal.project.local+ - "for pkg in $($HCPKG list --simple-output); do echo $pkg | sed 's/-[^-]*$//' | grep -vE -- '^(extensible)$' | sed 's/^/constraints: /' | sed 's/$/ installed/' >> cabal.project.local; done"+ - cat cabal.project || true+ - cat cabal.project.local || true # this builds all libraries and executables (without tests/benchmarks)- - cabal new-build -w ${HC} --disable-tests --disable-benchmarks all-- # Build with installed constraints for packages in global-db- - if $INSTALLED; then echo cabal new-build -w ${HC} --disable-tests --disable-benchmarks $(${HCPKG} list --global --simple-output --names-only | sed 's/\([a-zA-Z0-9-]\{1,\}\) */--constraint="\1 installed" /g') all | sh; else echo "Not building with installed constraints"; fi+ - ${CABAL} new-build -w ${HC} --disable-tests --disable-benchmarks all # build & run tests, build benchmarks- - cabal new-build -w ${HC} ${TEST} ${BENCH} all- - if [ "x$TEST" = "x--enable-tests" ]; then cabal new-test -w ${HC} ${TEST} ${BENCH} all; fi+ - ${CABAL} new-build -w ${HC} ${TEST} ${BENCH} all+ - if [ "x$TEST" = "x--enable-tests" ]; then ${CABAL} new-test -w ${HC} ${TEST} ${BENCH} all; fi # cabal check- - (cd extensible-* && cabal check)+ - (cd extensible-* && ${CABAL} check) # haddock- - rm -rf ./dist-newstyle- - if $HADDOCK; then cabal new-haddock -w ${HC} ${TEST} ${BENCH} all; else echo "Skipping haddock generation";fi+ - ${CABAL} new-haddock -w ${HC} ${TEST} ${BENCH} all -# REGENDATA ["extensible.cabal"]+ # Build without installed constraints for packages in global-db+ - rm -f cabal.project.local; ${CABAL} new-build -w ${HC} --disable-tests --disable-benchmarks all;++# REGENDATA ["./extensible.cabal"] # EOF
CHANGELOG.md view
@@ -1,3 +1,12 @@+0.5.1+-------------------------------------------------+* Split `Data.Extensible.HList` and `Data.Extensible.Internal` to the+ `membership` package+* `AssocKey`, `AssocValue`, `ValueIs`, `KeyValue` and their related combinators+ are deprecated. Use ones from `membership`+* `IsRecord` now has a generic default implementation+* Deprecated `deriveIsRecord`+ 0.5 ------------------------------------------------- * GHC older than 8.4 is no longer supported
extensible.cabal view
@@ -1,5 +1,5 @@ name: extensible-version: 0.5+version: 0.5.1 synopsis: Extensible, efficient, optics-friendly data types and effects homepage: https://github.com/fumieval/extensible bug-reports: http://github.com/fumieval/extensible/issues@@ -39,9 +39,7 @@ Data.Extensible.Effect Data.Extensible.Effect.Default Data.Extensible.GetOpt- Data.Extensible.HList Data.Extensible.Inclusion- Data.Extensible.Internal Data.Extensible.Internal.Rig Data.Extensible.Label Data.Extensible.Match@@ -77,6 +75,7 @@ , exceptions , ghc-prim , hashable+ , membership , monad-skeleton >= 0.1.2 , mtl , prettyprinter@@ -93,7 +92,7 @@ , unordered-containers , vector hs-source-dirs: src- ghc-options: -Wall+ ghc-options: -Wall -Wcompat default-language: Haskell2010 test-suite effects
src/Data/Extensible/Bits.hs view
@@ -1,5 +1,8 @@ {-# LANGUAGE UndecidableInstances, ScopedTypeVariables, MultiParamTypeClasses, TypeFamilies #-} {-# LANGUAGE GeneralizedNewtypeDeriving, DeriveGeneric #-}+#if __GLASGOW_HASKELL__ < 806+{-# LANGUAGE TypeInType #-}+#endif ----------------------------------------------------------------------- -- | -- Module : Data.Extensible.Bits@@ -27,11 +30,11 @@ import Data.Extensible.Class import Data.Extensible.Dictionary import Data.Extensible.Product-import Data.Extensible.Internal (getMemberId) import Data.Extensible.Field import Data.Functor.Identity import Data.Hashable import Data.Ix+import Data.Kind (Type) import Data.Profunctor.Rep import Data.Profunctor.Sieve import Data.Proxy@@ -42,7 +45,7 @@ import GHC.TypeLits -- | Bit-vector product. It has similar interface as @(:*)@ but fields are packed into @r@.-newtype BitProd r (h :: k -> *) (xs :: [k]) = BitProd { unBitProd :: r }+newtype BitProd r (h :: k -> Type) (xs :: [k]) = BitProd { unBitProd :: r } deriving (Eq, Ord, Enum, Bounded, Ix, Generic, Hashable, Storable) instance (Forall (Instance1 Show h) xs, BitFields r h xs) => Show (BitProd r h xs) where@@ -135,8 +138,8 @@ fromBits = Const . fromBits toBits = toBits . getConst -instance (Bits r, FromBits r (h (AssocValue x))) => FromBits r (Field h x) where- type BitWidth (Field h x) = BitWidth (h (AssocValue x))+instance (Bits r, FromBits r (h (TargetOf x))) => FromBits r (Field h x) where+ type BitWidth (Field h x) = BitWidth (h (TargetOf x)) fromBits = Field . fromBits toBits = toBits . getField @@ -183,8 +186,8 @@ offset = bitOffsetAt (Proxy :: Proxy r) (Proxy :: Proxy h) (Proxy :: Proxy xs) $ getMemberId i {-# INLINE bupdate #-} -bitOffsetAt :: forall r h xs. Forall (Instance1 (FromBits r) h) xs- => Proxy (r :: *) -> Proxy (h :: k -> *) -> Proxy (xs :: [k]) -> Int -> Int+bitOffsetAt :: forall k r h xs. Forall (Instance1 (FromBits r) h) xs+ => Proxy (r :: Type) -> Proxy (h :: k -> Type) -> Proxy (xs :: [k]) -> Int -> Int bitOffsetAt _ ph _ = henumerateFor (Proxy :: Proxy (Instance1 (FromBits r) h)) (Proxy :: Proxy xs)
src/Data/Extensible/Class.hs view
@@ -25,7 +25,6 @@ , leadership -- * Member , Member(..)- , remember , type (∈) , FindType -- * Generation@@ -35,18 +34,18 @@ -- * Association , Assoc(..) , type (>:)- , Associate(..)- , FindAssoc- -- * Sugar- , Elaborate- , Elaborated(..)+ , Lookup(..)+ , Associate+ -- * Misc+ , Head+ , Last ) where import Data.Constraint-import Data.Extensible.HList-import Data.Extensible.Internal import Data.Extensible.Internal.Rig (Optic') import Data.Extensible.Wrapper import Data.Profunctor+import Type.Membership+import Type.Membership.Internal -- | This class allows us to use 'pieceAt' for both sums and products. class (Functor f, Profunctor p) => Extensible f p (t :: (k -> *) -> [k] -> *) where@@ -60,7 +59,7 @@ {-# INLINE piece #-} -- | Like 'piece', but reckon membership from its key.-pieceAssoc :: (Associate k v xs, Extensible f p t, ExtensibleConstr t h xs (k ':> v)) => Optic' p f (t h xs) (h (k ':> v))+pieceAssoc :: (Lookup xs k v, Extensible f p t, ExtensibleConstr t h xs (k ':> v)) => Optic' p f (t h xs) (h (k ':> v)) pieceAssoc = pieceAt association {-# INLINE pieceAssoc #-} @@ -75,7 +74,7 @@ {-# INLINE item #-} -- | Access an element specified by the key type through a wrapper.-itemAssoc :: (Wrapper h, Extensible f p t, Associate k v xs, ExtensibleConstr t h xs (k ':> v))+itemAssoc :: (Wrapper h, Extensible f p t, Lookup xs k v, ExtensibleConstr t h xs (k ':> v)) => proxy k -> Optic' p f (t h xs) (Repr h (k ':> v)) itemAssoc p = pieceAssoc . _WrapperAs (proxyKey p) {-# INLINE itemAssoc #-}@@ -84,52 +83,14 @@ proxyKey _ = Proxy {-# INLINE proxyKey #-} --- | Every type-level list is an instance of 'Generate'.-class Generate (xs :: [k]) where- -- | Enumerate all possible 'Membership's of @xs@.- henumerate :: (forall x. Membership xs x -> r -> r) -> r -> r-- -- | Count the number of memberships.- hcount :: proxy xs -> Int-- -- | Enumerate 'Membership's and construct an 'HList'.- hgenerateList :: Applicative f- => (forall x. Membership xs x -> f (h x)) -> f (HList h xs)--instance Generate '[] where- henumerate _ r = r-- hcount _ = 0-- hgenerateList _ = pure HNil--instance Generate xs => Generate (x ': xs) where- henumerate f r = f here $ henumerate (f . navNext) r-- hcount _ = 1 + hcount (Proxy :: Proxy xs)-- -- | Enumerate 'Membership's and construct an 'HList'.- hgenerateList f = HCons <$> f here <*> hgenerateList (f . navNext)---- | Every element in @xs@ satisfies @c@-class (ForallF c xs, Generate xs) => Forall (c :: k -> Constraint) (xs :: [k]) where- -- | Enumerate all possible 'Membership's of @xs@ with an additional context.- henumerateFor :: proxy c -> proxy' xs -> (forall x. c x => Membership xs x -> r -> r) -> r -> r-- hgenerateListFor :: Applicative f- => proxy c -> (forall x. c x => Membership xs x -> f (h x)) -> f (HList h xs)--instance Forall c '[] where- henumerateFor _ _ _ r = r-- hgenerateListFor _ _ = pure HNil--instance (c x, Forall c xs) => Forall c (x ': xs) where- henumerateFor p _ f r = f here $ henumerateFor p (Proxy :: Proxy xs) (f . navNext) r+-- | First element+type family Head (xs :: [k]) :: k where+ Head (x ': xs) = x - hgenerateListFor p f = HCons <$> f here <*> hgenerateListFor p (f . navNext)+-- | Last element+type family Last (x :: [k]) :: k where+ Last '[x] = x+ Last (x ': xs) = Last xs --- | HACK: Without this, the constraints are not propagated well.-type family ForallF (c :: k -> Constraint) (xs :: [k]) :: Constraint where- ForallF c '[] = ()- ForallF c (x ': xs) = (c x, Forall c xs)+type Associate k v xs = Lookup xs k v+{-# DEPRECATED Associate "Use Lookup instead" #-}
src/Data/Extensible/Dictionary.hs view
@@ -26,7 +26,6 @@ import Data.Extensible.Field import Data.Extensible.Product import Data.Extensible.Sum-import Data.Extensible.Internal import Data.Extensible.Internal.Rig import Data.Extensible.Nullable import Data.Constraint@@ -41,11 +40,13 @@ import qualified Data.Vector.Unboxed as U import qualified Data.Vector as V import qualified Data.Text as T+import Data.Type.Equality import qualified Language.Haskell.TH.Lift as TH import Language.Haskell.TH hiding (Type) import GHC.TypeLits import Test.QuickCheck.Arbitrary import Test.QuickCheck.Gen+import Type.Membership -- | Reify a collection of dictionaries, as you wish. library :: forall c xs. Forall c xs => Comp Dict c :* xs@@ -94,8 +95,7 @@ instance (WrapForall Semigroup h xs, WrapForall Monoid h xs) => Monoid (h :* xs) where mempty = hrepeatFor (Proxy :: Proxy (Instance1 Monoid h)) mempty {-# INLINE mempty #-}- mappend = hzipWith3 (\(Comp Dict) -> mappend)- (library :: Comp Dict (Instance1 Monoid h) :* xs)+ mappend = (<>) {-# INLINE mappend #-} instance WrapForall Hashable h xs => Hashable (h :* xs) where@@ -132,7 +132,7 @@ basicUnsafeThaw (V_Product v) = fmap MV_Product $ hgenerateFor (Proxy :: Proxy (Instance1 U.Unbox h)) $ \m -> Comp <$> G.basicUnsafeThaw (hlookupC m v)- basicLength (V_Product v) = G.basicLength $ getComp $ hindex v here+ basicLength (V_Product v) = G.basicLength $ getComp $ hindex v leadership basicUnsafeSlice i n (V_Product v) = V_Product $ htabulateFor (Proxy :: Proxy (Instance1 U.Unbox h)) $ \m -> Comp $ G.basicUnsafeSlice i n (hlookupC m v)@@ -142,7 +142,7 @@ = henumerateFor (Proxy :: Proxy (Instance1 U.Unbox h)) (Proxy :: Proxy (x ': xs)) ((>>) . \i -> G.basicUnsafeCopy (hlookupC i v) (hlookupC i w)) (return ()) instance WrapForall U.Unbox h (x ': xs) => M.MVector U.MVector (h :* (x ': xs)) where- basicLength (MV_Product v) = M.basicLength $ getComp $ hindex v here+ basicLength (MV_Product v) = M.basicLength $ getComp $ hindex v leadership basicUnsafeSlice i n (MV_Product v) = MV_Product $ htabulateFor (Proxy :: Proxy (Instance1 U.Unbox h)) $ \m -> Comp $ M.basicUnsafeSlice i n (hlookupC m v)@@ -190,8 +190,8 @@ parseRecord rec = hgenerateFor (Proxy :: Proxy (Instance1 Csv.FromField h)) $ \i -> G.indexM rec (getMemberId i) >>= Csv.parseField -instance Forall (KeyValue KnownSymbol (Instance1 Csv.FromField h)) xs => Csv.FromNamedRecord (Field h :* xs) where- parseNamedRecord rec = hgenerateFor (Proxy :: Proxy (KeyValue KnownSymbol (Instance1 Csv.FromField h)))+instance Forall (KeyTargetAre KnownSymbol (Instance1 Csv.FromField h)) xs => Csv.FromNamedRecord (Field h :* xs) where+ parseNamedRecord rec = hgenerateFor (Proxy :: Proxy (KeyTargetAre KnownSymbol (Instance1 Csv.FromField h))) $ \i -> rec Csv..: BC.pack (symbolVal (proxyAssocKey i)) >>= Csv.parseField instance WrapForall Csv.ToField h xs => Csv.ToRecord (h :* xs) where@@ -199,33 +199,33 @@ . hfoldrWithIndexFor (Proxy :: Proxy (Instance1 Csv.ToField h)) (\_ v -> (:) $ Csv.toField v) [] -instance Forall (KeyValue KnownSymbol (Instance1 Csv.ToField h)) xs => Csv.ToNamedRecord (Field h :* xs) where- toNamedRecord = hfoldlWithIndexFor (Proxy :: Proxy (KeyValue KnownSymbol (Instance1 Csv.ToField h)))+instance Forall (KeyTargetAre KnownSymbol (Instance1 Csv.ToField h)) xs => Csv.ToNamedRecord (Field h :* xs) where+ toNamedRecord = hfoldlWithIndexFor (Proxy :: Proxy (KeyTargetAre KnownSymbol (Instance1 Csv.ToField h))) (\k m v -> HM.insert (BC.pack (symbolVal (proxyAssocKey k))) (Csv.toField v) m) HM.empty -- | @'parseJSON' 'J.Null'@ is called for missing fields.-instance Forall (KeyValue KnownSymbol (Instance1 J.FromJSON h)) xs => J.FromJSON (Field h :* xs) where+instance Forall (KeyTargetAre KnownSymbol (Instance1 J.FromJSON h)) xs => J.FromJSON (Field h :* xs) where parseJSON = J.withObject "Object" $ \v -> hgenerateFor- (Proxy :: Proxy (KeyValue KnownSymbol (Instance1 J.FromJSON h)))+ (Proxy :: Proxy (KeyTargetAre KnownSymbol (Instance1 J.FromJSON h))) $ \m -> let k = symbolVal (proxyAssocKey m) in fmap Field $ J.parseJSON $ maybe J.Null id $ HM.lookup (T.pack k) v -instance Forall (KeyValue KnownSymbol (Instance1 J.ToJSON h)) xs => J.ToJSON (Field h :* xs) where+instance Forall (KeyTargetAre KnownSymbol (Instance1 J.ToJSON h)) xs => J.ToJSON (Field h :* xs) where toJSON = J.Object . hfoldlWithIndexFor- (Proxy :: Proxy (KeyValue KnownSymbol (Instance1 J.ToJSON h)))+ (Proxy :: Proxy (KeyTargetAre KnownSymbol (Instance1 J.ToJSON h))) (\k m v -> HM.insert (T.pack (symbolVal (proxyAssocKey k))) (J.toJSON v) m) HM.empty -instance Forall (KeyValue KnownSymbol (Instance1 J.FromJSON h)) xs => J.FromJSON (Nullable (Field h) :* xs) where+instance Forall (KeyTargetAre KnownSymbol (Instance1 J.FromJSON h)) xs => J.FromJSON (Nullable (Field h) :* xs) where parseJSON = J.withObject "Object" $ \v -> hgenerateFor- (Proxy :: Proxy (KeyValue KnownSymbol (Instance1 J.FromJSON h)))+ (Proxy :: Proxy (KeyTargetAre KnownSymbol (Instance1 J.FromJSON h))) $ \m -> let k = symbolVal (proxyAssocKey m) in fmap Nullable $ traverse J.parseJSON $ HM.lookup (T.pack k) v -instance Forall (KeyValue KnownSymbol (Instance1 J.ToJSON h)) xs => J.ToJSON (Nullable (Field h) :* xs) where+instance Forall (KeyTargetAre KnownSymbol (Instance1 J.ToJSON h)) xs => J.ToJSON (Nullable (Field h) :* xs) where toJSON = J.Object . hfoldlWithIndexFor- (Proxy :: Proxy (KeyValue KnownSymbol (Instance1 J.ToJSON h)))+ (Proxy :: Proxy (KeyTargetAre KnownSymbol (Instance1 J.ToJSON h))) (\k m (Nullable v) -> maybe id (HM.insert (T.pack $ symbolVal $ proxyAssocKey k) . J.toJSON) v m) HM.empty
src/Data/Extensible/Effect.hs view
@@ -89,37 +89,36 @@ import Control.Monad.Trans.Cont (ContT(..)) import Data.Extensible.Field import Data.Extensible.Inclusion-import Data.Extensible.Internal import Data.Extensible.Internal.Rig import Data.Extensible.Product import Data.Extensible.Class import Data.Functor.Identity import Data.Profunctor.Unsafe -- Trustworthy since 7.8-import Data.Typeable (Typeable)+import Data.Type.Equality+import Type.Membership -- | A unit of named effects. This is a variant of @(':|')@ specialised for -- 'Type -> Type'. data Instruction (xs :: [Assoc k (* -> *)]) a where- Instruction :: !(Membership xs kv) -> AssocValue kv a -> Instruction xs a- deriving Typeable+ Instruction :: !(Membership xs kv) -> TargetOf kv a -> Instruction xs a -- | The extensible operational monad type Eff xs = Skeleton (Instruction xs) -- | Lift an instruction onto an 'Eff' action.-liftEff :: forall s t xs a. Associate s t xs => Proxy s -> t a -> Eff xs a+liftEff :: forall s t xs a. Lookup xs s t => Proxy s -> t a -> Eff xs a liftEff p x = liftsEff p x id {-# INLINE liftEff #-} -- | Lift an instruction onto an 'Eff' action and apply a function to the result.-liftsEff :: forall s t xs a r. Associate s t xs+liftsEff :: forall s t xs a r. Lookup xs s t => Proxy s -> t a -> (a -> r) -> Eff xs r liftsEff _ x k = boned $ Instruction (association :: Membership xs (s ':> t)) x :>>= return . k {-# INLINE liftsEff #-} -- | Censor a specific type of effects in an action.-hoistEff :: forall s t xs a. Associate s t xs => Proxy s -> (forall x. t x -> t x) -> Eff xs a -> Eff xs a+hoistEff :: forall s t xs a. Lookup xs s t => Proxy s -> (forall x. t x -> t x) -> Eff xs a -> Eff xs a hoistEff _ f = hoistSkeleton $ \(Instruction i t) -> case compareMembership (association :: Membership xs (s ':> t)) i of Right Refl -> Instruction i (f t) _ -> Instruction i t@@ -145,7 +144,7 @@ peelEff pass ret wrap = go where go m = case debone m of Return a -> ret a- Instruction i t :>>= k -> leadership i+ Instruction i t :>>= k -> testMembership i (\Refl -> wrap t (go . k)) (\j -> pass (Instruction j t) (go . k)) {-# INLINE peelEff #-}@@ -192,13 +191,12 @@ retractEff :: forall k m a. Monad m => Eff '[k >: m] a -> m a retractEff m = case debone m of Return a -> return a- Instruction i t :>>= k -> leadership i+ Instruction i t :>>= k -> testMembership i (\Refl -> t >>= retractEff . k) $ error "Impossible" -- | Transformation between effects newtype Interpreter f g = Interpreter { runInterpreter :: forall a. g a -> f a }- deriving Typeable -- | Process an 'Eff' action using a record of 'Interpreter's. handleEff :: RecordOf (Interpreter m) xs -> Eff xs a -> MonadView m (Eff xs) a@@ -237,7 +235,7 @@ peelAction pass ret wrap = go where go m = case debone m of Return a -> ret a- Instruction i t :>>= k -> leadership i+ Instruction i t :>>= k -> testMembership i (\Refl -> case t of (_ :: Action ps q x) -> let run :: forall t. Function t ((q -> r) -> r) -> Action t q x -> r@@ -253,7 +251,7 @@ peelAction0 wrap = go where go m = case debone m of Return a -> return a- Instruction i t :>>= k -> leadership i+ Instruction i t :>>= k -> testMembership i (\Refl -> case t of (_ :: Action ps q x) -> let run :: forall t. Function t (Eff xs q) -> Action t q x -> Eff xs a@@ -268,19 +266,19 @@ type ReaderEff = (:~:) -- | Fetch the environment.-askEff :: forall k r xs. Associate k (ReaderEff r) xs+askEff :: forall k r xs. Lookup xs k (ReaderEff r) => Proxy k -> Eff xs r askEff p = liftEff p Refl {-# INLINE askEff #-} -- | Pass the environment to a function.-asksEff :: forall k r xs a. Associate k (ReaderEff r) xs+asksEff :: forall k r xs a. Lookup xs k (ReaderEff r) => Proxy k -> (r -> a) -> Eff xs a asksEff p = liftsEff p Refl {-# INLINE asksEff #-} -- | Modify the enviroment locally.-localEff :: forall k r xs a. Associate k (ReaderEff r) xs+localEff :: forall k r xs a. Lookup xs k (ReaderEff r) => Proxy k -> (r -> r) -> Eff xs a -> Eff xs a localEff _ f = go where go m = case debone m of@@ -298,31 +296,31 @@ {-# INLINE runReaderEff #-} -- | Get the current state.-getEff :: forall k s xs. Associate k (State s) xs+getEff :: forall k s xs. Lookup xs k (State s) => Proxy k -> Eff xs s getEff k = liftEff k get {-# INLINE getEff #-} -- | Pass the current state to a function.-getsEff :: forall k s a xs. Associate k (State s) xs+getsEff :: forall k s a xs. Lookup xs k (State s) => Proxy k -> (s -> a) -> Eff xs a getsEff k = liftsEff k get {-# INLINE getsEff #-} -- | Replace the state with a new value.-putEff :: forall k s xs. Associate k (State s) xs+putEff :: forall k s xs. Lookup xs k (State s) => Proxy k -> s -> Eff xs () putEff k = liftEff k . put {-# INLINE putEff #-} -- | Modify the state.-modifyEff :: forall k s xs. Associate k (State s) xs+modifyEff :: forall k s xs. Lookup xs k (State s) => Proxy k -> (s -> s) -> Eff xs () modifyEff k f = liftEff k $ state $ \s -> ((), f s) {-# INLINE modifyEff #-} -- | Lift a state modification function.-stateEff :: forall k s xs a. Associate k (State s) xs+stateEff :: forall k s xs a. Lookup xs k (State s) => Proxy k -> (s -> (a, s)) -> Eff xs a stateEff k = liftEff k . state {-# INLINE stateEff #-}@@ -349,19 +347,19 @@ type WriterEff w = (,) w -- | Write the second element and return the first element.-writerEff :: forall k w xs a. (Associate k (WriterEff w) xs)+writerEff :: forall k w xs a. (Lookup xs k (WriterEff w)) => Proxy k -> (a, w) -> Eff xs a writerEff k (a, w) = liftEff k (w, a) {-# INLINE writerEff #-} -- | Write a value.-tellEff :: forall k w xs. (Associate k (WriterEff w) xs)+tellEff :: forall k w xs. (Lookup xs k (WriterEff w)) => Proxy k -> w -> Eff xs () tellEff k w = liftEff k (w, ()) {-# INLINE tellEff #-} -- | Squash the outputs into one step and return it.-listenEff :: forall k w xs a. (Associate k (WriterEff w) xs, Monoid w)+listenEff :: forall k w xs a. (Lookup xs k (WriterEff w), Monoid w) => Proxy k -> Eff xs a -> Eff xs (a, w) listenEff p = go mempty where go w m = case debone m of@@ -373,7 +371,7 @@ {-# INLINE listenEff #-} -- | Modify the output using the function in the result.-passEff :: forall k w xs a. (Associate k (WriterEff w) xs, Monoid w)+passEff :: forall k w xs a. (Lookup xs k (WriterEff w), Monoid w) => Proxy k -> Eff xs (a, w -> w) -> Eff xs a passEff p = go mempty where go w m = case debone m of@@ -401,7 +399,7 @@ type MaybeEff = Const () -- | Break out of the computation. Similar to 'Nothing'.-nothingEff :: Associate k MaybeEff xs => Proxy k -> Eff xs a+nothingEff :: Lookup xs k MaybeEff => Proxy k -> Eff xs a nothingEff = flip throwEff () -- | Run an effect which may fail in the name of @k@.@@ -413,12 +411,12 @@ type EitherEff = Const -- | Throw an exception @e@, throwing the rest of the computation away.-throwEff :: Associate k (EitherEff e) xs => Proxy k -> e -> Eff xs a+throwEff :: Lookup xs k (EitherEff e) => Proxy k -> e -> Eff xs a throwEff k = liftEff k . Const {-# INLINE throwEff #-} -- | Attach a handler for an exception.-catchEff :: forall k e xs a. (Associate k (EitherEff e) xs)+catchEff :: forall k e xs a. (Lookup xs k (EitherEff e)) => Proxy k -> Eff xs a -> (e -> Eff xs a) -> Eff xs a catchEff _ m0 handler = go m0 where go m = case debone m of@@ -434,7 +432,7 @@ {-# INLINE runEitherEff #-} -- | Put a milestone on a computation.-tickEff :: Associate k Identity xs => Proxy k -> Eff xs ()+tickEff :: Lookup xs k Identity => Proxy k -> Eff xs () tickEff k = liftEff k $ Identity () {-# INLINE tickEff #-} @@ -443,12 +441,12 @@ -> Eff xs (Either a (Eff (k >: Identity ': xs) a)) runIterEff m = case debone m of Return a -> return (Left a)- Instruction i t :>>= k -> leadership i+ Instruction i t :>>= k -> testMembership i (\Refl -> return $ Right $ k $ runIdentity t) $ \j -> boned $ Instruction j t :>>= runIterEff . k -- | Place a continuation-passing action.-contEff :: Associate k (ContT r m) xs => Proxy k+contEff :: Lookup xs k (ContT r m) => Proxy k -> ((a -> m r) -> m r) -> Eff xs a contEff k = liftEff k . ContT @@ -458,6 +456,6 @@ -> Eff xs r runContEff m cont = case debone m of Return a -> cont a- Instruction i t :>>= k -> leadership i+ Instruction i t :>>= k -> testMembership i (\Refl -> runContT t (flip runContEff cont . k)) $ \j -> boned $ Instruction j t :>>= flip runContEff cont . k
src/Data/Extensible/Effect/Default.hs view
@@ -30,7 +30,6 @@ ) where import Control.Applicative import Data.Extensible.Effect-import Data.Extensible.Internal import Control.Monad.Except import Control.Monad.Catch import Control.Monad.Reader.Class@@ -40,19 +39,21 @@ import Control.Monad.Trans.Resource #endif import Control.Monad.Writer.Class+import Data.Type.Equality+import Type.Membership -instance (MonadIO m, Associate "IO" m xs) => MonadIO (Eff xs) where+instance (MonadIO m, Lookup xs "IO" m) => MonadIO (Eff xs) where liftIO = liftEff (Proxy :: Proxy "IO") . liftIO #if MIN_VERSION_resourcet(1,2,0)-instance (MonadResource m, Associate "IO" m xs) => MonadResource (Eff xs) where+instance (MonadResource m, Lookup xs "IO" m) => MonadResource (Eff xs) where liftResourceT = liftEff (Proxy :: Proxy "IO") . liftResourceT #endif -instance (MonadThrow m, Associate "IO" m xs) => MonadThrow (Eff xs) where+instance (MonadThrow m, Lookup xs "IO" m) => MonadThrow (Eff xs) where throwM = liftEff (Proxy :: Proxy "IO") . throwM -instance (MonadCatch m, Associate "IO" m xs) => MonadCatch (Eff xs) where+instance (MonadCatch m, Lookup xs "IO" m) => MonadCatch (Eff xs) where catch m0 h = go m0 where go m = case debone m of Return a -> return a@@ -63,7 +64,7 @@ pReader :: Proxy "Reader" pReader = Proxy -instance Associate "Reader" ((:~:) r) xs => MonadReader r (Eff xs) where+instance Lookup xs "Reader" ((:~:) r) => MonadReader r (Eff xs) where ask = askEff pReader local = localEff pReader reader = asksEff pReader@@ -71,7 +72,7 @@ pState :: Proxy "State" pState = Proxy -instance Associate "State" (State s) xs => MonadState s (Eff xs) where+instance Lookup xs "State" (State s) => MonadState s (Eff xs) where get = getEff pState put = putEff pState state = stateEff pState@@ -79,7 +80,7 @@ pWriter :: Proxy "Writer" pWriter = Proxy -instance (Monoid w, Associate "Writer" ((,) w) xs) => MonadWriter w (Eff xs) where+instance (Monoid w, Lookup xs "Writer" ((,) w)) => MonadWriter w (Eff xs) where writer = writerEff pWriter tell = tellEff pWriter listen = listenEff pWriter@@ -88,16 +89,16 @@ pEither :: Proxy "Either" pEither = Proxy -instance (Associate "Either" (Const e) xs) => MonadError e (Eff xs) where+instance (Lookup xs "Either" (Const e)) => MonadError e (Eff xs) where throwError = throwEff pEither catchError = catchEff pEither -- | A bit dubious-instance (Monoid e, Associate "Either" (Const e) xs) => Alternative (Eff xs) where+instance (Monoid e, Lookup xs "Either" (Const e)) => Alternative (Eff xs) where empty = throwError mempty p <|> q = catchError p (const q) -instance (Monoid e, Associate "Either" (Const e) xs) => MonadPlus (Eff xs) where+instance (Monoid e, Lookup xs "Either" (Const e)) => MonadPlus (Eff xs) where mzero = empty mplus = (<|>)
src/Data/Extensible/Field.hs view
@@ -35,14 +35,22 @@ , matchWithField , matchField -- * Key / value+ , KeyOf+ , proxyKeyOf+ , stringKeyOf+ , TargetOf+ , proxyTargetOf+ , KeyIs+ , TargetIs+ , KeyTargetAre+ -- * deprecated , AssocKey , AssocValue+ , ValueIs , KeyValue , proxyAssocKey- , proxyAssocValue , stringAssocKey- , KeyIs- , ValueIs+ , proxyAssocValue -- * Internal , LabelPhantom , Labelling@@ -59,7 +67,6 @@ import Data.Extensible.Sum import Data.Extensible.Match import Data.Extensible.Product-import Data.Extensible.Internal import Data.Extensible.Internal.Rig import Data.Kind import Data.Profunctor.Unsafe@@ -68,7 +75,6 @@ import Data.Hashable import Data.String import Data.Text.Prettyprint.Doc-import Data.Typeable (Typeable) import qualified Data.Vector.Generic as G import qualified Data.Vector.Generic.Mutable as M import qualified Data.Vector.Unboxed as U@@ -78,54 +84,18 @@ import Language.Haskell.TH.Lift import Language.Haskell.TH (appE, conE) import Test.QuickCheck.Arbitrary---- | Take the type of the key-type family AssocKey (kv :: Assoc k v) :: k where- AssocKey (k ':> v) = k---- | Proxy-level 'AssocKey'. This is useful when using 'symbolVal'.-proxyAssocKey :: proxy kv -> Proxy (AssocKey kv)-proxyAssocKey _ = Proxy---- | Proxy-level 'AssocValue'.-proxyAssocValue :: proxy kv -> Proxy (AssocValue kv)-proxyAssocValue _ = Proxy---- | Get a string from a proxy of @'Assoc' 'Symbol' v@.-stringAssocKey :: (IsString a, KnownSymbol (AssocKey kv)) => proxy kv -> a-stringAssocKey = fromString . symbolVal . proxyAssocKey-{-# INLINE stringAssocKey #-}---- | Take the type of the value-type family AssocValue (kv :: Assoc k v) :: v where- AssocValue (k ':> v) = v---- | Combined constraint for 'Assoc'-class (pk (AssocKey kv), pv (AssocValue kv)) => KeyValue pk pv kv where--instance (pk k, pv v) => KeyValue pk pv (k ':> v)---- | Constraint applied to 'AssocKey'-class (pk (AssocKey kv)) => KeyIs pk kv where--instance (pk k) => KeyIs pk (k ':> v)---- | Constraint applied to 'AssocValue'-class (pv (AssocValue kv)) => ValueIs pv kv where--instance (pv v) => ValueIs pv (k ':> v)-+import Type.Membership -- | A @'Field' h (k ':> v)@ is @h v@ annotated with the field name @k@. -- -- @'Field' :: (v -> *) -> Assoc k v -> *@ -- newtype Field (h :: v -> Type) (kv :: Assoc k v)- = Field { getField :: h (AssocValue kv) }+ = Field { getField :: h (TargetOf kv) } - deriving (Typeable, Generic)+ deriving (Generic) -#define ND_Field(c) deriving instance c (h (AssocValue kv)) => c (Field h kv)+#define ND_Field(c) deriving instance c (h (TargetOf kv)) => c (Field h kv) ND_Field(Eq) ND_Field(Ord)@@ -149,10 +119,10 @@ ND_Field(J.FromJSON) ND_Field(J.ToJSON) -newtype instance U.MVector s (Field h x) = MV_Field (U.MVector s (h (AssocValue x)))-newtype instance U.Vector (Field h x) = V_Field (U.Vector (h (AssocValue x)))+newtype instance U.MVector s (Field h x) = MV_Field (U.MVector s (h (TargetOf x)))+newtype instance U.Vector (Field h x) = V_Field (U.Vector (h (TargetOf x))) -instance (U.Unbox (h (AssocValue x))) => M.MVector U.MVector (Field h x) where+instance (U.Unbox (h (TargetOf x))) => M.MVector U.MVector (Field h x) where {-# INLINE basicLength #-} {-# INLINE basicUnsafeSlice #-} {-# INLINE basicOverlaps #-}@@ -181,7 +151,7 @@ basicUnsafeMove (MV_Field v1) (MV_Field v2) = M.basicUnsafeMove v1 v2 basicUnsafeGrow (MV_Field v) n = MV_Field <$> M.basicUnsafeGrow v n -instance (U.Unbox (h (AssocValue x))) => G.Vector U.Vector (Field h x) where+instance (U.Unbox (h (TargetOf x))) => G.Vector U.Vector (Field h x) where {-# INLINE basicUnsafeFreeze #-} {-# INLINE basicUnsafeThaw #-} {-# INLINE basicLength #-}@@ -194,24 +164,24 @@ basicUnsafeIndexM (V_Field v) i = Field <$> G.basicUnsafeIndexM v i basicUnsafeCopy (MV_Field mv) (V_Field v) = G.basicUnsafeCopy mv v -instance (U.Unbox (h (AssocValue x))) => U.Unbox (Field h x)+instance (U.Unbox (h (TargetOf x))) => U.Unbox (Field h x) -instance Lift (h (AssocValue x)) => Lift (Field h x) where+instance Lift (h (TargetOf x)) => Lift (Field h x) where lift = appE (conE 'Field) . lift . getField -- | Lift a function for the content.-liftField :: (g (AssocValue kv) -> h (AssocValue kv)) -> Field g kv -> Field h kv+liftField :: (g (TargetOf kv) -> h (TargetOf kv)) -> Field g kv -> Field h kv liftField = coerce {-# INLINE liftField #-} -- | Lift a function for the content.-liftField2 :: (f (AssocValue kv) -> g (AssocValue kv) -> h (AssocValue kv))+liftField2 :: (f (TargetOf kv) -> g (TargetOf kv) -> h (TargetOf kv)) -> Field f kv -> Field g kv -> Field h kv liftField2 = coerce {-# INLINE liftField2 #-} instance Wrapper h => Wrapper (Field h) where- type Repr (Field h) kv = Repr h (AssocValue kv)+ type Repr (Field h) kv = Repr h (TargetOf kv) _Wrapper = dimap getField (fmap Field) . _Wrapper {-# INLINE _Wrapper #-} @@ -277,7 +247,7 @@ type FieldOptic k = forall kind. forall f p t xs (h :: kind -> Type) (v :: kind). (Extensible f p t , ExtensibleConstr t (Field h) xs (k ':> v)- , Associate k v xs+ , Lookup xs k v , Labelling k p , Wrapper h) => Optic' p f (t (Field h) xs) (Repr h v)@@ -340,3 +310,30 @@ (@==) = (@=) {-# INLINE (@==) #-} infix 1 @==++type AssocKey kv = KeyOf kv+{-# DEPRECATED AssocKey "Use KeyOf instead" #-}++type AssocValue kv = TargetOf kv+{-# DEPRECATED AssocValue "Use TargetOf instead" #-}++type ValueIs = TargetIs+{-# DEPRECATED ValueIs "Use TargetIs instead" #-}++type KeyValue = KeyTargetAre+{-# DEPRECATED KeyValue "Use KeyTargetAre instead" #-}++proxyAssocKey :: proxy kv -> Proxy (KeyOf kv)+proxyAssocKey = proxyKeyOf+{-# INLINE proxyAssocKey #-}+{-# DEPRECATED proxyAssocKey "Use proxyKeyOf instead" #-}++proxyAssocValue :: proxy kv -> Proxy (TargetOf kv)+proxyAssocValue = proxyTargetOf+{-# INLINE proxyAssocValue #-}+{-# DEPRECATED proxyAssocValue "Use proxyTargetOf instead" #-}++stringAssocKey :: (IsString a, KnownSymbol (KeyOf kv)) => proxy kv -> a+stringAssocKey = stringKeyOf+{-# INLINE stringAssocKey #-}+{-# DEPRECATED stringAssocKey "Use stringKeyOf instead" #-}
− src/Data/Extensible/HList.hs
@@ -1,48 +0,0 @@-{-# LANGUAGE ScopedTypeVariables, BangPatterns #-}-{-# LANGUAGE Trustworthy #-}--------------------------------------------------------------------------------- |--- Module : Data.Extensible.HList--- Copyright : (c) Fumiaki Kinoshita 2018--- License : BSD3------ Maintainer : Fumiaki Kinoshita <fumiexcel@gmail.com>------ Heterogeneous list--------------------------------------------------------------------------module Data.Extensible.HList where--import Data.Extensible.Internal-import Unsafe.Coerce--data HList (h :: k -> *) (xs :: [k]) where- HNil :: HList h '[]- HCons :: h x -> HList h xs -> HList h (x ': xs)--infixr 5 `HCons`--htraverse :: Applicative f => (forall x. g x -> f (h x)) -> HList g xs -> f (HList h xs)-htraverse _ HNil = pure HNil-htraverse f (HCons h xs) = HCons <$> f h <*> htraverse f xs--htraverseWithIndex :: forall f g h xs. Applicative f- => (forall x. Membership xs x -> g x -> f (h x)) -> HList g xs -> f (HList h xs)-htraverseWithIndex f = go 0 where- go :: Int -> HList g t -> f (HList h t)- go !k (HCons x xs) = HCons <$> f (unsafeCoerce k) x <*> go (k + 1) xs- go _ HNil = pure HNil-{-# INLINE htraverseWithIndex #-}--hfoldrWithIndex :: forall h r xs. (forall x. Membership xs x -> h x -> r -> r) -> r -> HList h xs -> r-hfoldrWithIndex f r = go 0 where- go :: Int -> HList h t -> r- go !k (HCons x xs) = f (unsafeCoerce k) x $ go (k + 1) xs- go _ HNil = r-{-# INLINE hfoldrWithIndex #-}--hlength :: HList h xs -> Int-hlength = go 0 where- go :: Int -> HList h xs -> Int- go n HNil = n- go n (HCons _ xs) = let !n' = n + 1 in go n' xs-{-# INLINE hlength #-}
src/Data/Extensible/Inclusion.hs view
@@ -32,8 +32,8 @@ import Data.Extensible.Class import Data.Extensible.Product import Data.Extensible.Sum-import Data.Extensible.Internal import Data.Extensible.Internal.Rig+import Data.Proxy -- | Unicode alias for 'Include' type xs ⊆ ys = Include ys xs@@ -59,7 +59,7 @@ ------------------------------------------------------------------ type family Associated' (xs :: [Assoc k v]) (t :: Assoc k v) :: Constraint where- Associated' xs (k ':> v) = Associate k v xs+ Associated' xs (k ':> v) = Lookup xs k v -- | @'Associated' xs (k ':> v)@ is equivalent to @'Associate' k v xs@ class Associated' xs t => Associated xs t where
− src/Data/Extensible/Internal.hs
@@ -1,199 +0,0 @@-{-# LANGUAGE Trustworthy #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE UndecidableInstances #-}-{-# LANGUAGE FunctionalDependencies #-}-{-# LANGUAGE BangPatterns #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE StandaloneDeriving #-}-{-# LANGUAGE TemplateHaskell #-}--------------------------------------------------------------------------------- |--- Module : Data.Extensible.Inclusion--- Copyright : (c) Fumiaki Kinoshita 2018--- License : BSD3------ Maintainer : Fumiaki Kinoshita <fumiexcel@gmail.com>------ A bunch of combinators that contains magic--------------------------------------------------------------------------module Data.Extensible.Internal (- -- * Membership- Membership- , getMemberId- , mkMembership- , reifyMembership- , leadership- , compareMembership- , impossibleMembership- , here- , navNext- -- * Member class- , Member(..)- , remember- , type (∈)- , FindType- -- * Association- , Assoc(..)- , type (>:)- , Associate(..)- , FindAssoc- -- * Sugar- , Elaborate- , Elaborated(..)- -- * Miscellaneous- , Head- , Last- , module Data.Type.Equality- , module Data.Proxy- ) where-import Control.DeepSeq (NFData)-import Data.Type.Equality-import Data.Proxy-import Control.Monad-import Unsafe.Coerce-import Data.Hashable-import Data.Text.Prettyprint.Doc-import Data.Typeable-import Language.Haskell.TH hiding (Pred)-import Language.Haskell.TH.Lift-import Data.Semigroup (Semigroup(..))-import GHC.TypeLits---- | Generates a 'Membership' that corresponds to the given ordinal (0-origin).-mkMembership :: Int -> Q Exp-mkMembership n = do- let names = map mkName $ take (n + 1) $ concatMap (flip replicateM ['a'..'z']) [1..]- let rest = mkName "any"- let cons x xs = PromotedConsT `AppT` x `AppT` xs- let t = foldr cons (VarT rest) (map VarT names)- sigE (conE 'Membership `appE` litE (IntegerL $ toInteger n))- $ forallT (PlainTV rest : map PlainTV names) (pure [])- $ conT ''Membership `appT` pure t `appT` varT (names !! n)---- | The position of @x@ in the type level set @xs@.-newtype Membership (xs :: [k]) (x :: k) = Membership- { getMemberId :: Int -- ^ get the position as an 'Int'.- } deriving (Typeable, NFData)--instance Lift (Membership xs x) where- lift (Membership i) = mkMembership i--newtype Remembrance xs x r = Remembrance (Member xs x => r)---- | Remember that @Member xs x@ from 'Membership'.-remember :: forall xs x r. Membership xs x -> (Member xs x => r) -> r-remember i r = unsafeCoerce (Remembrance r :: Remembrance xs x r) i-{-# INLINE remember #-}---- | @x@ is a member of @xs@-class Member xs x where- membership :: Membership xs x--instance (Elaborate x (FindType x xs) ~ 'Expecting pos, KnownNat pos) => Member xs x where- membership = Membership (fromInteger $ natVal (Proxy :: Proxy pos))- {-# INLINE membership #-}--instance Hashable (Membership xs x) where- hashWithSalt s = hashWithSalt s . getMemberId---- | Make up a 'Membership' from an integer.-reifyMembership :: Int -> (forall x. Membership xs x -> r) -> r-reifyMembership n k = k (Membership n)---- | The kind of key-value pairs-data Assoc k v = k :> v-infix 0 :>---- | A synonym for (':>')-type (>:) = '(:>)---- | @'Associate' k v xs@ is essentially identical to @(k :> v) ∈ xs@--- , but the type @v@ is inferred from @k@ and @xs@.-class Associate k v xs | k xs -> v where- association :: Membership xs (k ':> v)--instance (Elaborate k (FindAssoc 0 k xs) ~ 'Expecting (n ':> v), KnownNat n) => Associate k v xs where- association = Membership (fromInteger $ natVal (Proxy :: Proxy n))---- | A readable type search result-data Elaborated k v = Expecting v | Missing k | Duplicate k---- | Make the result more readable-type family Elaborate (key :: k) (xs :: [v]) :: Elaborated k v where- Elaborate k '[] = 'Missing k- Elaborate k '[x] = 'Expecting x- Elaborate k xs = 'Duplicate k---- | Find a type associated to the specified key.-type family FindAssoc (n :: Nat) (key :: k) (xs :: [Assoc k v]) where- FindAssoc n k ((k ':> v) ': xs) = (n ':> v) ': FindAssoc (1 + n) k xs- FindAssoc n k ((k' ':> v) ': xs) = FindAssoc (1 + n) k xs- FindAssoc n k '[] = '[]--instance Show (Membership xs x) where- show (Membership n) = "$(mkMembership " ++ show n ++ ")"--instance Pretty (Membership xs x) where- pretty (Membership n) = "$(mkMembership " <> pretty n <> ")"--instance Eq (Membership xs x) where- _ == _ = True--instance Ord (Membership xs x) where- compare _ _ = EQ--instance Semigroup (Membership xs x) where- x <> _ = x---- | Embodies a type equivalence to ensure that the 'Membership' points the first element.-leadership :: Membership (y ': xs) x -> (x :~: y -> r) -> (Membership xs x -> r) -> r-leadership (Membership 0) l _ = l (unsafeCoerce Refl)-leadership (Membership n) _ r = r (Membership (n - 1))-{-# INLINE leadership #-}---- | Compare two 'Membership's.-compareMembership :: Membership xs x -> Membership xs y -> Either Ordering (x :~: y)-compareMembership (Membership m) (Membership n) = case compare m n of- EQ -> Right (unsafeCoerce Refl)- x -> Left x-{-# INLINE compareMembership #-}---- | There is no 'Membership' of an empty list.-impossibleMembership :: Membership '[] x -> r-impossibleMembership _ = error "Impossible"---- | The 'Membership' points the first element-here :: Membership (x ': xs) x-here = Membership 0-{-# INLINE here #-}---- | The next membership-navNext :: Membership xs y -> Membership (x ': xs) y-navNext (Membership n) = Membership (n + 1)-{-# INLINE navNext #-}---- | Unicode flipped alias for 'Member'-type x ∈ xs = Member xs x---- | First element-type family Head (xs :: [k]) :: k where- Head (x ': xs) = x---- | FindType types-type family FindType (x :: k) (xs :: [k]) :: [Nat] where- FindType x (x ': xs) = 0 ': FindType x xs- FindType x (y ': ys) = MapSucc (FindType x ys)- FindType x '[] = '[]---- | Last element-type family Last (x :: [k]) :: k where- Last '[x] = x- Last (x ': xs) = Last xs---- | Ideally, it will be 'Map Succ'-type family MapSucc (xs :: [Nat]) :: [Nat] where- MapSucc '[] = '[]- MapSucc (x ': xs) = (1 + x) ': MapSucc xs
src/Data/Extensible/Label.hs view
@@ -30,7 +30,7 @@ 訊 = itemAssoc instance (Extensible f p e- , Associate k v xs+ , Lookup xs k v , Labelling k p , Wrapper h , ExtensibleConstr e (Field h) xs (k ':> v)
src/Data/Extensible/Nullable.hs view
@@ -41,13 +41,13 @@ _Wrapper = withIso _Wrapper $ \f g -> dimap (fmap f . getNullable) (fmap (Nullable . fmap g)) instance Semigroup (h x) => Semigroup (Nullable h x) where- (<>) = mappend+ Nullable (Just a) <> Nullable (Just b) = Nullable (Just (a <> b))+ a@(Nullable (Just _)) <> _ = a+ _ <> b = b instance Semigroup (h x) => Monoid (Nullable h x) where mempty = Nullable Nothing- mappend (Nullable (Just a)) (Nullable (Just b)) = Nullable (Just (a <> b))- mappend a@(Nullable (Just _)) _ = a- mappend _ b = b+ mappend = (<>) instance Lift (h a) => Lift (Nullable h a) where lift = appE (conE 'Nullable) . lift . getNullable
src/Data/Extensible/Plain.hs view
@@ -18,7 +18,6 @@ , (<%|) , accessing ) where-import Data.Extensible.Internal import Data.Extensible.Internal.Rig import Data.Extensible.Class import Data.Extensible.Product
src/Data/Extensible/Product.hs view
@@ -61,13 +61,12 @@ , htabulateFor , hrepeatFor) where -import Data.Extensible.Internal import Data.Extensible.Internal.Rig (review) import Data.Extensible.Struct import Data.Extensible.Sum import Data.Extensible.Class-import qualified Data.Extensible.HList as HList import Data.Extensible.Wrapper+import qualified Type.Membership.HList as HList -- | O(n) Prepend an element onto a product. -- Expressions like @a <: b <: c <: nil@ are transformed to a single 'fromHList'.
src/Data/Extensible/Record.hs view
@@ -1,4 +1,8 @@ {-# LANGUAGE LambdaCase, TemplateHaskell, TypeFamilies #-}+{-# LANGUAGE DefaultSignatures #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE UndecidableInstances #-} ------------------------------------------------------------------------ -- | -- Module : Data.Extensible.Record@@ -12,14 +16,15 @@ module Data.Extensible.Record (IsRecord(..), toRecord, fromRecord, record, deriveIsRecord) where import Language.Haskell.TH-import Data.Extensible.Internal import Data.Extensible.Internal.Rig-import Data.Extensible.HList import Data.Extensible.Product import Data.Extensible.Field import Data.Functor.Identity import Data.Profunctor+import GHC.Generics import GHC.TypeLits+import Type.Membership+import Type.Membership.HList -- | The class of types that can be converted to/from a 'Record'. class IsRecord a where@@ -27,11 +32,52 @@ recordFromList :: HList (Field Identity) (RecFields a) -> a recordToList :: a -> HList (Field Identity) (RecFields a) + type RecFields a = GRecFields (Rep a) '[]+ default recordFromList :: (Generic a, GIsRecord (Rep a) '[], GRecFields (Rep a) '[] ~ RecFields a) => HList (Field Identity) (RecFields a) -> a+ recordFromList xs = recordFromList' xs (\x (HNil :: HList (Field Identity) '[]) -> to x)++ default recordToList :: (Generic a, GIsRecord (Rep a) '[], GRecFields (Rep a) '[] ~ RecFields a) => a -> HList (Field Identity) (RecFields a)+ recordToList x = recordToList' (from x) HNil+ instance IsRecord () where type RecFields () = '[] recordFromList _ = () recordToList _ = HNil +-- | The class of types that can be converted to/from a 'Record'.+class GIsRecord f r where+ type GRecFields f (r :: [Assoc Symbol *]) :: [Assoc Symbol *]+ recordFromList' :: HList (Field Identity) (GRecFields f r) -> (f x -> HList (Field Identity) r -> cont) -> cont+ recordToList' :: f x -> HList (Field Identity) r -> HList (Field Identity) (GRecFields f r)++instance (GIsRecord f (GRecFields g r), GIsRecord g r) => GIsRecord (f :*: g) r where+ type GRecFields (f :*: g) r = GRecFields f (GRecFields g r)+ recordFromList' xs cont = recordFromList' xs $ \l ys -> recordFromList' ys $ \r zs -> cont (l :*: r) zs+ {-# INLINE recordFromList' #-}+ recordToList' (f :*: g) = recordToList' f . recordToList' g+ {-# INLINE recordToList' #-}++instance GIsRecord (S1 ('MetaSel ('Just name) su ss ds) (K1 i a)) r where+ type GRecFields (S1 ('MetaSel ('Just name) su ss ds) (K1 i a)) r = (name >: a) ': r+ recordFromList' (HCons (Field (Identity a)) xs) cont = cont (M1 (K1 a)) xs+ {-# INLINE recordFromList' #-}+ recordToList' (M1 (K1 a)) = HCons (Field (Identity a))+ {-# INLINE recordToList' #-}++instance GIsRecord f r => GIsRecord (C1 i f) r where+ type GRecFields (C1 i f) r = GRecFields f r+ recordFromList' xs cont = recordFromList' xs $ cont . M1+ {-# INLINE recordFromList' #-}+ recordToList' (M1 f) = recordToList' f+ {-# INLINE recordToList' #-}++instance GIsRecord f r => GIsRecord (D1 i f) r where+ type GRecFields (D1 i f) r = GRecFields f r+ recordFromList' xs cont = recordFromList' xs $ cont . M1+ {-# INLINE recordFromList' #-}+ recordToList' (M1 f) = recordToList' f+ {-# INLINE recordToList' #-}+ -- | Convert a value into a 'Record'. toRecord :: IsRecord a => a -> Record (RecFields a) toRecord = fromHList . recordToList@@ -52,6 +98,7 @@ tvName (PlainTV n) = n tvName (KindedTV n _) = n +{-# DEPRECATED deriveIsRecord "Use the generic default methods instead" #-} -- | Create an 'IsRecord' instance for a normal record declaration. deriveIsRecord :: Name -> DecsQ deriveIsRecord name = reify name >>= \case
src/Data/Extensible/Struct.hs view
@@ -46,26 +46,24 @@ , toHList) where import GHC.Prim+import Control.Comonad import Control.Monad import Control.Monad.IO.Class import Control.Monad.Primitive import Control.Monad.ST import Data.Constraint import Data.Extensible.Class-import Data.Extensible.Internal import Data.Extensible.Internal.Rig import Data.Extensible.Wrapper-import Control.Comonad import Data.Profunctor.Rep import Data.Profunctor.Sieve+import Data.Proxy import qualified Data.StateVar as V-import Data.Typeable (Typeable)-import qualified Data.Extensible.HList as L import GHC.Types+import qualified Type.Membership.HList as L -- | Mutable type-indexed struct. data Struct s (h :: k -> *) (xs :: [k]) = Struct (SmallMutableArray# s Any)- deriving Typeable -- | Write a value in a 'Struct'. set :: PrimMonad m => Struct (PrimState m) h xs -> Membership xs x -> h x -> m ()@@ -137,7 +135,7 @@ WrappedPointer s i $~! f = liftIO $ void $ atomicModify'_ s i $ over _Wrapper f -- | Get a 'WrappedPointer' from a name.-(-$>) :: forall k h xs v s. (Associate k v xs) => Struct s h xs -> Proxy k -> WrappedPointer s h (Repr h (k ':> v))+(-$>) :: forall k h xs v s. (Lookup xs k v) => Struct s h xs -> Proxy k -> WrappedPointer s h (Repr h (k ':> v)) s -$> _ = WrappedPointer s (association :: Membership xs (k ':> v)) {-# INLINE (-$>) #-} @@ -239,6 +237,8 @@ case copySmallArray# rhs 0# a lhsSz rhsSz s2 of { s3 -> case unsafeFreezeSmallArray# a s3 of { (# s4, frz #) -> (# s4, HProduct frz #) }}}}++infixr 5 `happend` unsafeMembership :: Int -> Membership xs x unsafeMembership = unsafeCoerce#
src/Data/Extensible/Sum.hs view
@@ -23,10 +23,11 @@ , embedAssoc ) where -import Data.Extensible.Internal-import Data.Typeable import Data.Extensible.Class import Data.Profunctor+import Data.Proxy+import Data.Type.Equality+import Type.Membership -- | The extensible sum type --@@ -34,7 +35,6 @@ -- data (h :: k -> *) :| (s :: [k]) where EmbedAt :: !(Membership xs x) -> h x -> h :| xs-deriving instance Typeable (:|) instance Enum (Proxy :| xs) where fromEnum (EmbedAt m _) = fromIntegral $ getMemberId m@@ -71,7 +71,7 @@ -> (h :| xs -> r) -> h :| (x ': xs) -> r-(<:|) r c = \(EmbedAt i h) -> leadership i+(<:|) r c = \(EmbedAt i h) -> testMembership i (\Refl -> r h) (\j -> c (EmbedAt j h)) infixr 1 <:|@@ -82,7 +82,7 @@ exhaust _ = error "Impossible" -- | Embed a value, but focuses on its key.-embedAssoc :: Associate k a xs => h (k ':> a) -> h :| xs+embedAssoc :: Lookup xs k a => h (k ':> a) -> h :| xs embedAssoc = EmbedAt association {-# INLINE embedAssoc #-}
src/Data/Extensible/TH.hs view
@@ -15,8 +15,6 @@ , decEffectSuite , customDecEffects) where -import Data.Proxy-import Data.Extensible.Internal import Data.Extensible.Class (itemAssoc) import Data.Extensible.Effect import Data.Extensible.Field@@ -24,6 +22,7 @@ import Language.Haskell.TH import Data.Char import Control.Monad+import Type.Membership -- | Generate fields using 'itemAssoc'. -- @'mkField' "foo Bar"@ defines:@@ -186,7 +185,7 @@ -> Type -- type -> Name -- variable -> Type-associateT nameT t xs = ConT ''Associate `AppT` nameT `AppT` t `AppT` VarT xs+associateT nameT t xs = ConT ''Lookup `AppT` VarT xs `AppT` nameT `AppT` t effClause :: Type -- effect key -> Int -- number of arguments
src/Data/Extensible/Tangle.hs view
@@ -41,10 +41,10 @@ instance (Monad m, Monoid a) => Monoid (TangleT h xs m a) where mempty = pure mempty- mappend = liftA2 mappend+ mappend = (<>) -- | Hitch an element associated to the 'FieldName' through a wrapper.-lasso :: forall k v m h xs. (Monad m, Associate k v xs, Wrapper h)+lasso :: forall k v m h xs. (Monad m, Lookup xs k v, Wrapper h) => FieldName k -> TangleT h xs m (Repr h (k ':> v)) lasso _ = view _Wrapper <$> hitchAt (association :: Membership xs (k ':> v)) {-# INLINE lasso #-}
src/Data/Extensible/Wrapper.hs view
@@ -136,7 +136,7 @@ instance (Monoid (f a), Monoid (g a)) => Monoid (Prod f g a) where mempty = Prod mempty mempty- Prod a b `mappend` Prod c d = Prod (mappend a c) (mappend b d)+ mappend = (<>) instance (Arbitrary (f a), Arbitrary (g a)) => Arbitrary (Prod f g a) where arbitrary = Prod <$> arbitrary <*> arbitrary