{{
{type KVStore} is an ability that models a key-value store.
# Example
@typecheck```
KVStore.modify : (v -> v) -> k ->{KVStore k v} ()
KVStore.modify f k =
KVStore.put (f KVStore.get)
```
```
KVStore.modify (x -> x + 1)
```
}}
unique ability KVStore a b where
get : a ->{KVStore a b} Optional b
put : a -> b ->{KVStore a b} ()
{{ Adds a couple of key-value pairs to the {KVStore} and
Reads them back. }}
myProgram : '{KVStore Nat Nat} Text
myProgram _ =
use KVStore put
put 3 4
put 5 6
maybeFour = KVStore.get 3
Optional.map Nat.toText maybeFour
|> Optional.getOrElse "nothing here"
{{ An in-memory key-value store that implements the {type KVStore} ability.
``inMemory p`` runs the computation ''p'', starting with an empty {type Map}
as the store.
}}
inMemory : '{g, KVStore a b} r ->{g} r
inMemory keyValueInteractions =
impl : Map a b -> abilities.Request {KVStore a b} r -> r
impl map = cases
{ pure } -> pure
{KVStore.get key -> resume} ->
handle resume (Map.get key map) with impl map
{KVStore.put key value -> resume} ->
updatedMap = Map.insert key value map
handle !resume with impl updatedMap
handle !keyValueInteractions with impl Map.empty