Safe Haskell | None |
---|---|
Language | Haskell2010 |
This module provides storage interfaces.
Synopsis
- class StoreHasField store fname ftype | store fname -> ftype where
- storeFieldOps :: StoreFieldOps store fname ftype
- data StoreFieldOps store fname ftype = StoreFieldOps {
- sopToField :: forall s. Label fname -> (store ': s) :-> (ftype ': s)
- sopSetField :: forall s. Label fname -> (ftype ': (store ': s)) :-> (store ': s)
- class StoreHasSubmap store mname key value | store mname -> key value where
- storeSubmapOps :: StoreSubmapOps store mname key value
- data StoreSubmapOps store mname key value = StoreSubmapOps {
- sopMem :: forall s. Label mname -> (key ': (store ': s)) :-> (Bool ': s)
- sopGet :: forall s. Label mname -> (key ': (store ': s)) :-> (Maybe value ': s)
- sopUpdate :: forall s. Label mname -> (key ': (Maybe value ': (store ': s))) :-> (store ': s)
- sopDelete :: forall s. Maybe (Label mname -> (key ': (store ': s)) :-> (store ': s))
- sopInsert :: forall s. Maybe (Label mname -> (key ': (value ': (store ': s))) :-> (store ': s))
- data k ~> v
- type family StorageContains store (content :: [NamedField]) :: Constraint where ...
- stToField :: StoreHasField store fname ftype => Label fname -> (store ': s) :-> (ftype ': s)
- stGetField :: StoreHasField store fname ftype => Label fname -> (store ': s) :-> (ftype ': (store ': s))
- stSetField :: StoreHasField store fname ftype => Label fname -> (ftype ': (store ': s)) :-> (store ': s)
- stMem :: StoreHasSubmap store mname key value => Label mname -> (key ': (store ': s)) :-> (Bool ': s)
- stGet :: StoreHasSubmap store mname key value => Label mname -> (key ': (store ': s)) :-> (Maybe value ': s)
- stUpdate :: StoreHasSubmap store mname key value => Label mname -> (key ': (Maybe value ': (store ': s))) :-> (store ': s)
- stDelete :: forall store mname key value s. (StoreHasSubmap store mname key value, KnownValue value) => Label mname -> (key ': (store ': s)) :-> (store ': s)
- stInsert :: StoreHasSubmap store mname key value => Label mname -> (key ': (value ': (store ': s))) :-> (store ': s)
- stInsertNew :: StoreHasSubmap store mname key value => Label mname -> (forall s0 any. (key ': s0) :-> any) -> (key ': (value ': (store ': s))) :-> (store ': s)
- storeFieldOpsADT :: HasFieldOfType dt fname ftype => StoreFieldOps dt fname ftype
- storeFieldOpsDeeper :: (HasFieldOfType storage fieldsPartName fields, StoreHasField fields fname ftype) => Label fieldsPartName -> StoreFieldOps storage fname ftype
- storeSubmapOpsDeeper :: (HasFieldOfType storage bigMapPartName fields, StoreHasSubmap fields mname key value) => Label bigMapPartName -> StoreSubmapOps storage mname key value
- storeFieldOpsReferTo :: Label name -> StoreFieldOps storage name field -> StoreFieldOps storage desiredName field
- storeSubmapOpsReferTo :: Label name -> StoreSubmapOps storage name key value -> StoreSubmapOps storage desiredName key value
- composeStoreFieldOps :: Label nameInStore -> StoreFieldOps store nameInStore substore -> StoreFieldOps substore nameInSubstore field -> StoreFieldOps store nameInSubstore field
- composeStoreSubmapOps :: Label nameInStore -> StoreFieldOps store nameInStore substore -> StoreSubmapOps substore mname key value -> StoreSubmapOps store mname key value
Class
class StoreHasField store fname ftype | store fname -> ftype where Source #
Provides operations on fields for storage.
storeFieldOps :: StoreFieldOps store fname ftype Source #
Instances
HasUField fname ftype templ => StoreHasField (UStore templ) fname ftype Source # | |
Defined in Lorentz.UStore.Instances storeFieldOps :: StoreFieldOps (UStore templ) fname ftype Source # | |
(StoreHasField other fname ftype, IsoValue store, IsoValue other) => StoreHasField (StorageSkeleton store other) fname ftype Source # | |
Defined in Lorentz.Store storeFieldOps :: StoreFieldOps (StorageSkeleton store other) fname ftype Source # |
data StoreFieldOps store fname ftype Source #
Datatype containing the full implementation of StoreHasField
typeclass.
We use this grouping because in most cases implementation will be chosen
among the default ones, and initializing all methods at once is simpler
and more consistent.
(One can say that we are trying to emulate benefits of DerivingVia
extension.)
StoreFieldOps | |
|
class StoreHasSubmap store mname key value | store mname -> key value where Source #
Provides operations on fields for storage.
storeSubmapOps :: StoreSubmapOps store mname key value Source #
Instances
HasUStore mname key value templ => StoreHasSubmap (UStore templ) mname key value Source # | |
Defined in Lorentz.UStore.Instances storeSubmapOps :: StoreSubmapOps (UStore templ) mname key value Source # | |
(StoreMemC store name, StoreGetC store name, StoreUpdateC store name, key ~ GetStoreKey store name, value ~ GetStoreValue store name) => StoreHasSubmap (Store store) name key value Source # | |
Defined in Lorentz.Store storeSubmapOps :: StoreSubmapOps (Store store) name key value Source # | |
(key ~ key', value ~ value', IsComparable key) => StoreHasSubmap (Map key' value') name key value Source # |
|
Defined in Lorentz.StoreClass storeSubmapOps :: StoreSubmapOps (Map key' value') name key value Source # | |
(key ~ key', value ~ value', IsComparable key) => StoreHasSubmap (BigMap key' value') name key value Source # |
|
Defined in Lorentz.StoreClass storeSubmapOps :: StoreSubmapOps (BigMap key' value') name key value Source # | |
(StoreMemC store name, StoreGetC store name, StoreUpdateC store name, key ~ GetStoreKey store name, value ~ GetStoreValue store name, IsoValue other) => StoreHasSubmap (StorageSkeleton store other) name key value Source # | |
Defined in Lorentz.Store storeSubmapOps :: StoreSubmapOps (StorageSkeleton store other) name key value Source # |
data StoreSubmapOps store mname key value Source #
Datatype containing the full implementation of StoreHasField
typeclass.
We use this grouping because in most cases implementation will be chosen
among the default ones, and initializing all methods at once is simpler
and more consistent.
(One can say that we are trying to emulate DerivingVia
extension.)
StoreSubmapOps | |
|
Expressing constraints on storage
type family StorageContains store (content :: [NamedField]) :: Constraint where ... Source #
Concise way to write down constraints with expected content of a storage.
Use it like follows:
type StorageConstraint = StorageContains [ "fieldInt" := Int , "fieldNat" := Nat , "balances" := Address ~> Int ]
StorageContains _ '[] = () | |
StorageContains store ((n := (k ~> v)) ': ct) = (StoreHasSubmap store n k v, StorageContains store ct) | |
StorageContains store ((n := ty) ': ct) = (StoreHasField store n ty, StorageContains store ct) |
Methods to work with storage
stToField :: StoreHasField store fname ftype => Label fname -> (store ': s) :-> (ftype ': s) Source #
Pick storage field.
stGetField :: StoreHasField store fname ftype => Label fname -> (store ': s) :-> (ftype ': (store ': s)) Source #
Get storage field, preserving the storage itself on stack.
stSetField :: StoreHasField store fname ftype => Label fname -> (ftype ': (store ': s)) :-> (store ': s) Source #
Update storage field.
stMem :: StoreHasSubmap store mname key value => Label mname -> (key ': (store ': s)) :-> (Bool ': s) Source #
Check value presence in storage.
stGet :: StoreHasSubmap store mname key value => Label mname -> (key ': (store ': s)) :-> (Maybe value ': s) Source #
Get value in storage.
stUpdate :: StoreHasSubmap store mname key value => Label mname -> (key ': (Maybe value ': (store ': s))) :-> (store ': s) Source #
Update a value in storage.
stDelete :: forall store mname key value s. (StoreHasSubmap store mname key value, KnownValue value) => Label mname -> (key ': (store ': s)) :-> (store ': s) Source #
Delete a value in storage.
stInsert :: StoreHasSubmap store mname key value => Label mname -> (key ': (value ': (store ': s))) :-> (store ': s) Source #
Add a value in storage.
stInsertNew :: StoreHasSubmap store mname key value => Label mname -> (forall s0 any. (key ': s0) :-> any) -> (key ': (value ': (store ': s))) :-> (store ': s) Source #
Add a value in storage, but fail if it will overwrite some existing entry.
Implementations
storeFieldOpsADT :: HasFieldOfType dt fname ftype => StoreFieldOps dt fname ftype Source #
Implementation of StoreHasField
for case of datatype
keeping a pack of fields.
storeFieldOpsDeeper :: (HasFieldOfType storage fieldsPartName fields, StoreHasField fields fname ftype) => Label fieldsPartName -> StoreFieldOps storage fname ftype Source #
Implementation of StoreHasField
for a data type which has an
instance of StoreHasField
inside.
For instance, it can be used for top-level storage.
storeSubmapOpsDeeper :: (HasFieldOfType storage bigMapPartName fields, StoreHasSubmap fields mname key value) => Label bigMapPartName -> StoreSubmapOps storage mname key value Source #
Implementation of StoreHasSubmap
for a data type which has an
instance of StoreHasSubmap
inside.
For instance, it can be used for top-level storage.
storeFieldOpsReferTo :: Label name -> StoreFieldOps storage name field -> StoreFieldOps storage desiredName field Source #
Pretend that given StoreSubmapOps
implementation is made up
for submap with name desiredName
, not its actual name.
Logic of the implementation remains the same.
See also storeSubmapOpsReferTo
.
storeSubmapOpsReferTo :: Label name -> StoreSubmapOps storage name key value -> StoreSubmapOps storage desiredName key value Source #
Pretend that given StoreSubmapOps
implementation is made up
for submap with name desiredName
, not its actual name.
Logic of the implementation remains the same.
Use case: imagine that your code requires access to submap named X
,
but in your storage that submap is called Y
.
Then you implement the instance which makes X
refer to Y
:
instance StoreHasSubmap Store X Key Value where storeSubmapOps = storeSubmapOpsReferTo #Y storeSubmapOpsForY
composeStoreFieldOps :: Label nameInStore -> StoreFieldOps store nameInStore substore -> StoreFieldOps substore nameInSubstore field -> StoreFieldOps store nameInSubstore field Source #
Chain two implementations of field operations.
Suits for a case when your store does not contain its fields directly rather has a nested structure.
composeStoreSubmapOps :: Label nameInStore -> StoreFieldOps store nameInStore substore -> StoreSubmapOps substore mname key value -> StoreSubmapOps store mname key value Source #
Chain implementations of field and submap operations.