Safe Haskell | None |
---|---|
Language | Haskell2010 |
Synopsis
- data label := value = KnownSymbol label => (FldProxy label) := !value
- type Record lts = Rec (Sort lts)
- rnil :: Rec '[]
- rcons :: forall l t lts s sortedLts. (RecSize lts ~ s, sortedLts ~ Sort ((l := t) ': lts), KnownNat s, KnownNat (RecVecIdxPos l sortedLts), KeyDoesNotExist l lts, RecCopy lts lts sortedLts) => (l := t) -> Rec lts -> Rec sortedLts
- (&) :: forall l t lts s sortedLts. (RecSize lts ~ s, sortedLts ~ Sort ((l := t) ': lts), KnownNat s, KnownNat (RecVecIdxPos l sortedLts), KeyDoesNotExist l lts, RecCopy lts lts sortedLts) => (l := t) -> Rec lts -> Rec sortedLts
- fld :: FldProxy l -> FldProxy l
- type Has l lts v = (RecTy l lts ~ v, KnownNat (RecSize lts), KnownNat (RecVecIdxPos l lts))
- type family HasOf (req :: [*]) (lts :: [*]) :: Constraint where ...
- get :: forall l v lts. Has l lts v => FldProxy l -> Rec lts -> v
- (&.) :: forall l v lts. Has l lts v => Rec lts -> FldProxy l -> v
- set :: forall l v lts. Has l lts v => FldProxy l -> v -> Rec lts -> Rec lts
- modify :: forall l v lts. Has l lts v => FldProxy l -> (v -> v) -> Rec lts -> Rec lts
- getPath :: RecApplyPath k x => k -> Rec x -> RecDeepTy k x
- setPath :: RecApplyPath k x => k -> RecDeepTy k x -> Rec x -> Rec x
- modifyPath :: RecApplyPath k x => k -> (RecDeepTy k x -> RecDeepTy k x) -> Rec x -> Rec x
- class RecApplyPath p x
- data lbl :& more
- (&:) :: FldProxy q -> more -> q :& more
- (&:-) :: FldProxy q -> FldProxy r -> q :& FldProxy r
- combine :: forall lhs rhs sortRes. (KnownNat (RecSize lhs), KnownNat (RecSize rhs), KnownNat (RecSize lhs + RecSize rhs), sortRes ~ Sort (RecAppend lhs rhs), RecCopy lhs lhs sortRes, RecCopy rhs rhs sortRes) => Rec lhs -> Rec rhs -> Rec sortRes
- (++:) :: forall lhs rhs sortRes. (KnownNat (RecSize lhs), KnownNat (RecSize rhs), KnownNat (RecSize lhs + RecSize rhs), sortRes ~ Sort (RecAppend lhs rhs), RecCopy lhs lhs sortRes, RecCopy rhs rhs sortRes) => Rec lhs -> Rec rhs -> Rec sortRes
- type RecAppend lhs rhs = RecAppendH lhs rhs rhs '[]
- reflectRec :: forall c r lts. RecApply lts lts c => Proxy c -> (forall a. c a => String -> a -> r) -> Rec lts -> [r]
- reflectRecFold :: forall c r lts. RecApply lts lts c => Proxy c -> (forall a. c a => String -> a -> r -> r) -> Rec lts -> r -> r
- class RecApply (rts :: [*]) (lts :: [*]) c where
- class FromNative a lts | a -> lts
- fromNative :: (Generic a, FromNative (Rep a) lts) => a -> Rec lts
- class ToNative a lts
- toNative :: (Generic a, ToNative (Rep a) lts) => Rec lts -> a
- asksR :: (Has lbl lts v, MonadReader (Rec lts) m) => FldProxy lbl -> m v
- asksRP :: (RecApplyPath k x, MonadReader (Rec x) m) => k -> m (RecDeepTy k x)
- getsR :: (Has lbl lts v, MonadState (Rec lts) m) => FldProxy lbl -> m v
- setsR :: (Has lbl lts v, MonadState (Rec lts) m) => FldProxy lbl -> v -> m ()
- modifiesR :: (Has lbl lts v, MonadState (Rec lts) m) => FldProxy lbl -> (v -> v) -> m ()
- getsRP :: (RecApplyPath k x, MonadState (Rec x) m) => k -> m (RecDeepTy k x)
- setsRP :: (RecApplyPath k x, MonadState (Rec x) m) => k -> RecDeepTy k x -> m ()
- modifiesRP :: (RecApplyPath k x, MonadState (Rec x) m) => k -> (RecDeepTy k x -> RecDeepTy k x) -> m ()
- lens :: Has l lts v => FldProxy l -> Lens (Rec lts) (Rec lts) v v
- data Rec (lts :: [*])
- class RecCopy (pts :: [*]) (lts :: [*]) (rts :: [*])
- type family RecTyIdxH (i :: Nat) (l :: Symbol) (lts :: [*]) :: Nat where ...
- showRec :: forall lts. RecApply lts lts Show => Rec lts -> [(String, String)]
- class RecKeys (lts :: [*]) where
- recKeys :: forall t (lts :: [*]). RecKeys lts => t lts -> [String]
- class RecEq (rts :: [*]) (lts :: [*]) where
- recToValue :: forall lts. RecApply lts lts ToJSON => Rec lts -> Value
- recToEncoding :: forall lts. RecApply lts lts ToJSON => Rec lts -> Encoding
- recJsonParser :: forall lts s. (RecSize lts ~ s, KnownNat s, RecJsonParse lts) => Value -> Parser (Rec lts)
- class RecJsonParse (lts :: [*]) where
- recJsonParse :: Int -> Object -> Parser (Rec lts)
- class RecNfData (lts :: [*]) (rts :: [*]) where
- type RecVecIdxPos l lts = (RecSize lts - RecTyIdxH 0 l lts) - 1
- type family RecSize (lts :: [*]) :: Nat where ...
- type family RemoveAccessTo (l :: Symbol) (lts :: [*]) :: [*] where ...
- data FldProxy (t :: Symbol) = FldProxy
- type family RecDeepTy (ps :: r) (lts :: [*]) :: * where ...
- type family RecAll (c :: u -> Constraint) (rs :: [u]) :: Constraint where ...
- type family KeyDoesNotExist (l :: Symbol) (lts :: [*]) :: Constraint where ...
- type Sort xs = FieldListSort xs
- unsafeRNil :: Int -> Rec '[]
- unsafeRCons :: forall l t lts s. (RecSize lts ~ s, KnownNat s, KeyDoesNotExist l lts) => (l := t) -> Rec lts -> Rec ((l := t) ': lts)
Basics
data label := value infix 6 Source #
Field named l
labels value of type t
adapted from the awesome labels package.
Example: (#name := "Chris") :: ("name" := String)
KnownSymbol label => (FldProxy label) := !value infix 6 |
Instances
(RecEq rts (RemoveAccessTo l lts), Has l rts v, Eq v) => RecEq rts ((l := t) ': lts) Source # | |
(KnownSymbol l, RecApply rts (RemoveAccessTo l lts) c, Has l rts v, c v) => RecApply rts ((l := t) ': lts) c Source # | |
KnownSymbol name => FromNative (S1 (MetaSel (Just name) p s l) (Rec0 t) :: k -> Type) ((name := t) ': ([] :: [Type])) Source # | |
Defined in SuperRecord | |
(KnownSymbol lbl, ToJSON t, ToJSON (JsonTaggedVariant ts)) => ToJSON (JsonTaggedVariant ((lbl := t) ': ts)) Source # | |
Defined in SuperRecord.Variant.Tagged toJSON :: JsonTaggedVariant ((lbl := t) ': ts) -> Value # toEncoding :: JsonTaggedVariant ((lbl := t) ': ts) -> Encoding # toJSONList :: [JsonTaggedVariant ((lbl := t) ': ts)] -> Value # toEncodingList :: [JsonTaggedVariant ((lbl := t) ': ts)] -> Encoding # | |
(FromJSON t, FromJSON (JsonTaggedVariant ts), KnownSymbol lbl) => FromJSON (JsonTaggedVariant ((lbl := t) ': ts)) Source # | |
Defined in SuperRecord.Variant.Tagged parseJSON :: Value -> Parser (JsonTaggedVariant ((lbl := t) ': ts)) # parseJSONList :: Value -> Parser [JsonTaggedVariant ((lbl := t) ': ts)] # | |
Eq value => Eq (label := value) Source # | |
Ord value => Ord (label := value) Source # | |
Defined in SuperRecord.Field compare :: (label := value) -> (label := value) -> Ordering # (<) :: (label := value) -> (label := value) -> Bool # (<=) :: (label := value) -> (label := value) -> Bool # (>) :: (label := value) -> (label := value) -> Bool # (>=) :: (label := value) -> (label := value) -> Bool # max :: (label := value) -> (label := value) -> label := value # min :: (label := value) -> (label := value) -> label := value # | |
Show t => Show (l := t) Source # | |
(KnownSymbol l, FromJSON t, RecJsonParse lts, RecSize lts ~ s, KnownNat s, KeyDoesNotExist l lts) => RecJsonParse ((l := t) ': lts) Source # | |
Defined in SuperRecord | |
(KnownSymbol l, RecKeys lts) => RecKeys ((l := t) ': lts) Source # | |
(Has l rts v, NFData v, RecNfData (RemoveAccessTo l lts) rts) => RecNfData ((l := t) ': lts) rts Source # | |
(Has l rts t, Has l lts t, RecCopy (RemoveAccessTo l ((l := t) ': pts)) lts rts) => RecCopy ((l := t) ': pts) lts rts Source # | |
Defined in SuperRecord recCopyInto :: Proxy ((l := t) ': pts) -> Rec lts -> Proxy rts -> SmallMutableArray# s Any -> State# s -> State# s | |
type RecKeysT ((l := t) ': lts) Source # | |
Defined in SuperRecord |
type Record lts = Rec (Sort lts) Source #
The core record type. Prefer this type when manually writing type signatures
rcons :: forall l t lts s sortedLts. (RecSize lts ~ s, sortedLts ~ Sort ((l := t) ': lts), KnownNat s, KnownNat (RecVecIdxPos l sortedLts), KeyDoesNotExist l lts, RecCopy lts lts sortedLts) => (l := t) -> Rec lts -> Rec sortedLts Source #
Prepend a record entry to a record Rec
(&) :: forall l t lts s sortedLts. (RecSize lts ~ s, sortedLts ~ Sort ((l := t) ': lts), KnownNat s, KnownNat (RecVecIdxPos l sortedLts), KeyDoesNotExist l lts, RecCopy lts lts sortedLts) => (l := t) -> Rec lts -> Rec sortedLts infixr 5 Source #
Alias for rcons
fld :: FldProxy l -> FldProxy l Source #
Helper function to allow to clearing specify unknown IsLabel
cases
type Has l lts v = (RecTy l lts ~ v, KnownNat (RecSize lts), KnownNat (RecVecIdxPos l lts)) Source #
Require a record to contain a label
type family HasOf (req :: [*]) (lts :: [*]) :: Constraint where ... Source #
Require a record to contain at least the listed labels
get :: forall l v lts. Has l lts v => FldProxy l -> Rec lts -> v Source #
Get an existing record field
set :: forall l v lts. Has l lts v => FldProxy l -> v -> Rec lts -> Rec lts Source #
Update an existing record field
modify :: forall l v lts. Has l lts v => FldProxy l -> (v -> v) -> Rec lts -> Rec lts Source #
Update an existing record field
getPath :: RecApplyPath k x => k -> Rec x -> RecDeepTy k x Source #
Perform a deep read. This is somewhat similar to using (&.), but is useful
when you want to share a RecPath
between getPath
, modifyPath
and/or setPath
setPath :: RecApplyPath k x => k -> RecDeepTy k x -> Rec x -> Rec x Source #
Perform a deep update, setting the key along the path to the desired value
modifyPath :: RecApplyPath k x => k -> (RecDeepTy k x -> RecDeepTy k x) -> Rec x -> Rec x Source #
Perform a deep update, transforming the value at the final key
class RecApplyPath p x Source #
setPath', getPath'
data lbl :& more infixr 8 Source #
Constructor for field accessor paths
(&:-) :: FldProxy q -> FldProxy r -> q :& FldProxy r infixr 8 Source #
Specialized version of (&:) to help writing the last piece of the path w/o confusing the type checker
combine :: forall lhs rhs sortRes. (KnownNat (RecSize lhs), KnownNat (RecSize rhs), KnownNat (RecSize lhs + RecSize rhs), sortRes ~ Sort (RecAppend lhs rhs), RecCopy lhs lhs sortRes, RecCopy rhs rhs sortRes) => Rec lhs -> Rec rhs -> Rec sortRes Source #
Combine two records
(++:) :: forall lhs rhs sortRes. (KnownNat (RecSize lhs), KnownNat (RecSize rhs), KnownNat (RecSize lhs + RecSize rhs), sortRes ~ Sort (RecAppend lhs rhs), RecCopy lhs lhs sortRes, RecCopy rhs rhs sortRes) => Rec lhs -> Rec rhs -> Rec sortRes Source #
Alias for combine
Reflection
reflectRec :: forall c r lts. RecApply lts lts c => Proxy c -> (forall a. c a => String -> a -> r) -> Rec lts -> [r] Source #
Apply a function to each key element pair for a record
reflectRecFold :: forall c r lts. RecApply lts lts c => Proxy c -> (forall a. c a => String -> a -> r -> r) -> Rec lts -> r -> r Source #
Fold over all elements of a record
class RecApply (rts :: [*]) (lts :: [*]) c where Source #
Machinery needed to implement reflectRec
recApply :: (forall a. Dict (c a) -> String -> a -> b -> b) -> Rec rts -> Proxy lts -> b -> b Source #
Native type interop
class FromNative a lts | a -> lts Source #
Conversion helper to bring a Haskell type to a record. Note that the
native Haskell type must be an instance of Generic
fromNative'
Instances
(FromNative l lhs, FromNative r rhs, lts ~ Sort (RecAppend lhs rhs), RecCopy lhs lhs lts, RecCopy rhs rhs lts, KnownNat (RecSize lhs), KnownNat (RecSize rhs), KnownNat (RecSize lhs + RecSize rhs)) => FromNative (l :*: r :: k -> Type) lts Source # | |
Defined in SuperRecord fromNative' :: (l :*: r) x -> Rec lts | |
FromNative cs lts => FromNative (C1 m cs :: k -> Type) lts Source # | |
Defined in SuperRecord fromNative' :: C1 m cs x -> Rec lts | |
FromNative cs lts => FromNative (D1 m cs :: k -> Type) lts Source # | |
Defined in SuperRecord fromNative' :: D1 m cs x -> Rec lts | |
KnownSymbol name => FromNative (S1 (MetaSel (Just name) p s l) (Rec0 t) :: k -> Type) ((name := t) ': ([] :: [Type])) Source # | |
Defined in SuperRecord |
fromNative :: (Generic a, FromNative (Rep a) lts) => a -> Rec lts Source #
Convert a native Haskell type to a record
Conversion helper to bring a record back into a Haskell type. Note that the
native Haskell type must be an instance of Generic
toNative'
Instances
(ToNative l lts, ToNative r lts) => ToNative (l :*: r :: k -> Type) lts Source # | |
Defined in SuperRecord | |
Has name lts t => ToNative (S1 (MetaSel (Just name) p s l) (Rec0 t) :: k -> Type) lts Source # | |
ToNative cs lts => ToNative (C1 m cs :: k -> Type) lts Source # | |
Defined in SuperRecord | |
ToNative cs lts => ToNative (D1 m cs :: k -> Type) lts Source # | |
Defined in SuperRecord |
toNative :: (Generic a, ToNative (Rep a) lts) => Rec lts -> a Source #
Convert a record to a native Haskell type
MTL interop
asksR :: (Has lbl lts v, MonadReader (Rec lts) m) => FldProxy lbl -> m v Source #
Like asks
for MonadReader
, but you provide a record field you would like
to read from your environment
asksRP :: (RecApplyPath k x, MonadReader (Rec x) m) => k -> m (RecDeepTy k x) Source #
Like asks
for MonadReader
, but you provide a record field you would like
to read from your environment
getsR :: (Has lbl lts v, MonadState (Rec lts) m) => FldProxy lbl -> m v Source #
Like gets
for MonadState
, but you provide a record field you would like
to read from your environment
setsR :: (Has lbl lts v, MonadState (Rec lts) m) => FldProxy lbl -> v -> m () Source #
Similar to put
for MonadState
, but you only set a single record field
modifiesR :: (Has lbl lts v, MonadState (Rec lts) m) => FldProxy lbl -> (v -> v) -> m () Source #
Similar to modify
for MonadState
, but you update a single record field
getsRP :: (RecApplyPath k x, MonadState (Rec x) m) => k -> m (RecDeepTy k x) Source #
Similar to gets
for MonadState
, but allows getting a value along a RecPath
setsRP :: (RecApplyPath k x, MonadState (Rec x) m) => k -> RecDeepTy k x -> m () Source #
Similar to put
for MonadState
, but you only set a single record field
modifiesRP :: (RecApplyPath k x, MonadState (Rec x) m) => k -> (RecDeepTy k x -> RecDeepTy k x) -> m () Source #
Similar to modify
for MonadState
, but you update a single record field
Lens interop
lens :: Has l lts v => FldProxy l -> Lens (Rec lts) (Rec lts) v v Source #
Convert a field label to a lens
Machinery
data Rec (lts :: [*]) Source #
Internal record type. When manually writing an explicit type signature for
a record, use Record
instead. For abstract type signatures Rec
will work
well.
Instances
RecEq lts lts => Eq (Rec lts) Source # | |
RecApply lts lts Show => Show (Rec lts) Source # | |
RecApply lts lts ToJSON => ToJSON (Rec lts) Source # | |
Defined in SuperRecord | |
(RecSize lts ~ s, KnownNat s, RecJsonParse lts) => FromJSON (Rec lts) Source # | |
RecNfData lts lts => NFData (Rec lts) Source # | |
Defined in SuperRecord |
class RecCopy (pts :: [*]) (lts :: [*]) (rts :: [*]) Source #
recCopyInto
Instances
RecCopy ([] :: [Type]) lts rts Source # | |
Defined in SuperRecord recCopyInto :: Proxy [] -> Rec lts -> Proxy rts -> SmallMutableArray# s Any -> State# s -> State# s | |
(Has l rts t, Has l lts t, RecCopy (RemoveAccessTo l ((l := t) ': pts)) lts rts) => RecCopy ((l := t) ': pts) lts rts Source # | |
Defined in SuperRecord recCopyInto :: Proxy ((l := t) ': pts) -> Rec lts -> Proxy rts -> SmallMutableArray# s Any -> State# s -> State# s |
showRec :: forall lts. RecApply lts lts Show => Rec lts -> [(String, String)] Source #
Convert all elements of a record to a String
class RecKeys (lts :: [*]) where Source #
Get keys of a record on value and type level
class RecEq (rts :: [*]) (lts :: [*]) where Source #
Machinery to implement equality
recJsonParser :: forall lts s. (RecSize lts ~ s, KnownNat s, RecJsonParse lts) => Value -> Parser (Rec lts) Source #
class RecJsonParse (lts :: [*]) where Source #
Machinery to implement parseJSON
Instances
RecJsonParse ([] :: [Type]) Source # | |
Defined in SuperRecord | |
(KnownSymbol l, FromJSON t, RecJsonParse lts, RecSize lts ~ s, KnownNat s, KeyDoesNotExist l lts) => RecJsonParse ((l := t) ': lts) Source # | |
Defined in SuperRecord |
class RecNfData (lts :: [*]) (rts :: [*]) where Source #
Machinery for NFData
type family RemoveAccessTo (l :: Symbol) (lts :: [*]) :: [*] where ... Source #
RemoveAccessTo l ((l := t) ': lts) = RemoveAccessTo l lts | |
RemoveAccessTo q ((l := t) ': lts) = (l := t) ': RemoveAccessTo l lts | |
RemoveAccessTo q '[] = '[] |
data FldProxy (t :: Symbol) Source #
A proxy witness for a label. Very similar to Proxy
, but needed to implement
a non-orphan IsLabel
instance
Instances
l ~ l' => IsLabel l (FldProxy l') Source # | |
Defined in SuperRecord.Field | |
Eq (FldProxy t) Source # | |
Ord (FldProxy t) Source # | |
Read (FldProxy t) Source # | |
Show (FldProxy t) Source # | |
(Has l lts t, t ~ RecDeepTy (FldProxy l) lts) => RecApplyPath (FldProxy l) lts Source # | |
type family RecAll (c :: u -> Constraint) (rs :: [u]) :: Constraint where ... Source #
type family KeyDoesNotExist (l :: Symbol) (lts :: [*]) :: Constraint where ... Source #
KeyDoesNotExist l '[] = True ~ True | |
KeyDoesNotExist l ((l := t) ': lts) = TypeError (Text "Duplicate key " :<>: Text l) | |
KeyDoesNotExist q ((l := t) ': lts) = KeyDoesNotExist q lts |
type Sort xs = FieldListSort xs Source #
Sort a list of fields using merge sort, alias to FieldListSort
Unsafe operations
unsafeRNil :: Int -> Rec '[] Source #
An empty record with an initial size for the record
unsafeRCons :: forall l t lts s. (RecSize lts ~ s, KnownNat s, KeyDoesNotExist l lts) => (l := t) -> Rec lts -> Rec ((l := t) ': lts) Source #
Prepend a record entry to a record Rec
. Assumes that the record was created with
unsafeRNil
and still has enough free slots, mutates the original Rec
which should
not be reused after