Copyright | (c) Fumiaki Kinoshita 2018 |
---|---|
License | BSD3 |
Maintainer | Fumiaki Kinoshita <[email protected]> |
Safe Haskell | None |
Language | Haskell2010 |
Data.Extensible.Field
Description
Flexible records and variants
Synopsis
- newtype Field (h :: v -> Type) (kv :: Assoc k v) = Field {}
- (@=) :: forall {v1} {k1} (h :: v1 -> Type) (k2 :: k1) (v2 :: v1). Wrapper h => Proxy k2 -> Repr h v2 -> Field h (k2 ':> v2)
- (<@=>) :: forall {v1} {k1} f (h :: v1 -> Type) (k2 :: k1) (v2 :: v1). (Functor f, Wrapper h) => Proxy k2 -> f (Repr h v2) -> Compose f (Field h :: Assoc k1 v1 -> Type) (k2 ':> v2)
- (@:>) :: forall {k1} {v1} (k2 :: k1) h (v2 :: v1). Proxy k2 -> h v2 -> Field h (k2 ':> v2)
- (@==) :: forall (k :: Symbol) v. Proxy k -> v -> Field Identity (k ':> v)
- type FieldOptic (k1 :: k) = forall kind (f :: Type -> Type) (p :: Type -> Type -> Type) (t :: [Assoc k kind] -> (Assoc k kind -> Type) -> Type) (xs :: [Assoc k kind]) (h :: kind -> Type) (v :: kind). (Extensible f p t, ExtensibleConstr t xs (Field h :: Assoc k kind -> Type) (k1 ':> v), Lookup xs k1 v, Wrapper h) => Optic' p f (t xs (Field h :: Assoc k kind -> Type)) (Repr h v)
- xlb :: forall {k1} (k2 :: k1). Proxy k2 -> FieldOptic k2
- liftField :: forall {v} {k} g (kv :: Assoc k v) h. (g (TargetOf kv) -> h (TargetOf kv)) -> Field g kv -> Field h kv
- liftField2 :: forall {v} {k} f (kv :: Assoc k v) g h. (f (TargetOf kv) -> g (TargetOf kv) -> h (TargetOf kv)) -> Field f kv -> Field g kv -> Field h kv
- type RecordOf (h :: v -> Type) (xs :: [Assoc k v]) = xs :& (Field h :: Assoc k v -> Type)
- type Record (xs :: [Assoc k Type]) = RecordOf Identity xs
- emptyRecord :: Record ('[] :: [Assoc k Type])
- type VariantOf (h :: v -> Type) (xs :: [Assoc k v]) = xs :/ (Field h :: Assoc k v -> Type)
- type Variant (xs :: [Assoc k Type]) = VariantOf Identity xs
- matchWithField :: forall {v} {k} f g r (xs :: [Assoc k v]). (forall (x :: v). f x -> g x -> r) -> RecordOf f xs -> VariantOf g xs -> r
- matchField :: forall {v} {k} (h :: v -> Type) r (xs :: [Assoc k v]). RecordOf (Match h r) xs -> VariantOf h xs -> r
- type family KeyOf (kv :: Assoc k v) :: k where ...
- proxyKeyOf :: forall {k} {v} proxy (kv :: Assoc k v). proxy kv -> Proxy (KeyOf kv)
- stringKeyOf :: forall {v} a (kv :: Assoc Symbol v) proxy. (IsString a, KnownSymbol (KeyOf kv)) => proxy kv -> a
- type family TargetOf (kv :: Assoc k v) :: v where ...
- proxyTargetOf :: forall {k1} {k2} proxy (kv :: Assoc k1 k2). proxy kv -> Proxy (TargetOf kv)
- class pk (KeyOf kv) => KeyIs (pk :: k -> Constraint) (kv :: Assoc k v)
- class pv (TargetOf kv) => TargetIs (pv :: k -> Constraint) (kv :: Assoc k1 k)
- class (pk (KeyOf kv), pv (TargetOf kv)) => KeyTargetAre (pk :: k -> Constraint) (pv :: k1 -> Constraint) (kv :: Assoc k k1)
Documentation
newtype Field (h :: v -> Type) (kv :: Assoc k v) Source #
A
is Field
h (k ':> v)h v
annotated with the field name k
.
Field
:: (v -> Type) -> Assoc k v -> Type
Instances
(@=) :: forall {v1} {k1} (h :: v1 -> Type) (k2 :: k1) (v2 :: v1). Wrapper h => Proxy k2 -> Repr h v2 -> Field h (k2 ':> v2) infix 1 Source #
Annotate a value by the field name.
foo :: Record
'["num" >: Int, "str" >: String]
foo = #num @= 42
<: #str @= "foo"
<: nil
(<@=>) :: forall {v1} {k1} f (h :: v1 -> Type) (k2 :: k1) (v2 :: v1). (Functor f, Wrapper h) => Proxy k2 -> f (Repr h v2) -> Compose f (Field h :: Assoc k1 v1 -> Type) (k2 ':> v2) infix 1 Source #
(@:>) :: forall {k1} {v1} (k2 :: k1) h (v2 :: v1). Proxy k2 -> h v2 -> Field h (k2 ':> v2) infix 1 Source #
Annotate a value by the field name without Wrapper
.
(@==) :: forall (k :: Symbol) v. Proxy k -> v -> Field Identity (k ':> v) infix 1 Source #
Kind-monomorphic, unwrapped version of @=
type FieldOptic (k1 :: k) = forall kind (f :: Type -> Type) (p :: Type -> Type -> Type) (t :: [Assoc k kind] -> (Assoc k kind -> Type) -> Type) (xs :: [Assoc k kind]) (h :: kind -> Type) (v :: kind). (Extensible f p t, ExtensibleConstr t xs (Field h :: Assoc k kind -> Type) (k1 ':> v), Lookup xs k1 v, Wrapper h) => Optic' p f (t xs (Field h :: Assoc k kind -> Type)) (Repr h v) Source #
FieldOptic s
is a type of optics that points a field/constructor named s
.
The yielding fields can be
Lenses
for Record
s and
Prisms
for Variant
s.
FieldOptic
"foo" = Lookup xs "foo" a => Lens' (Record
xs) aFieldOptic
"foo" = Lookup xs "foo" a => Prism' (Variant
xs) a
FieldOptic
s can be generated using mkField
defined in the Data.Extensible.TH module.
xlb :: forall {k1} (k2 :: k1). Proxy k2 -> FieldOptic k2 Source #
Specialised version of itemAssoc
. Stands for "eXtensible LaBel"
liftField :: forall {v} {k} g (kv :: Assoc k v) h. (g (TargetOf kv) -> h (TargetOf kv)) -> Field g kv -> Field h kv Source #
Lift a function for the content.
liftField2 :: forall {v} {k} f (kv :: Assoc k v) g h. (f (TargetOf kv) -> g (TargetOf kv) -> h (TargetOf kv)) -> Field f kv -> Field g kv -> Field h kv Source #
Lift a function for the content.
Records and variants
type RecordOf (h :: v -> Type) (xs :: [Assoc k v]) = xs :& (Field h :: Assoc k v -> Type) Source #
The type of records which contain several fields.
RecordOf :: (v -> Type) -> [Assoc k v] -> Type
type VariantOf (h :: v -> Type) (xs :: [Assoc k v]) = xs :/ (Field h :: Assoc k v -> Type) Source #
The dual of RecordOf
VariantOf :: (v -> Type) -> [Assoc k v] -> Type
Matching
matchWithField :: forall {v} {k} f g r (xs :: [Assoc k v]). (forall (x :: v). f x -> g x -> r) -> RecordOf f xs -> VariantOf g xs -> r Source #
Select a corresponding field of a variant.
matchField :: forall {v} {k} (h :: v -> Type) r (xs :: [Assoc k v]). RecordOf (Match h r) xs -> VariantOf h xs -> r Source #
Pattern matching on a Variant
Key / value
proxyKeyOf :: forall {k} {v} proxy (kv :: Assoc k v). proxy kv -> Proxy (KeyOf kv) #
stringKeyOf :: forall {v} a (kv :: Assoc Symbol v) proxy. (IsString a, KnownSymbol (KeyOf kv)) => proxy kv -> a #
proxyTargetOf :: forall {k1} {k2} proxy (kv :: Assoc k1 k2). proxy kv -> Proxy (TargetOf kv) #
Proxy-level TargetOf
.
class pk (KeyOf kv) => KeyIs (pk :: k -> Constraint) (kv :: Assoc k v) #
Constraint applied to KeyOf
Instances
pk k2 => KeyIs (pk :: k1 -> Constraint) (k2 ':> v2 :: Assoc k1 v1) | |
Defined in Type.Membership |
class pv (TargetOf kv) => TargetIs (pv :: k -> Constraint) (kv :: Assoc k1 k) #
Constraint applied to TargetOf
Instances
pv v2 => TargetIs (pv :: v1 -> Constraint) (k2 ':> v2 :: Assoc k1 v1) | |
Defined in Type.Membership |
class (pk (KeyOf kv), pv (TargetOf kv)) => KeyTargetAre (pk :: k -> Constraint) (pv :: k1 -> Constraint) (kv :: Assoc k k1) #
Combined constraint for Assoc
Instances
(pk k2, pv v2) => KeyTargetAre (pk :: k1 -> Constraint) (pv :: v1 -> Constraint) (k2 ':> v2 :: Assoc k1 v1) | |
Defined in Type.Membership |