I have a code sample like this:
type Db =
| Db of Map<string, string>
let get id db =
let (Db dict) = db
dict
|> Map.tryFind id
|> (fun x -> x, db)
let add id value db =
let (Db dict) = db
dict
|> Map.add id value
|> Db
|> (fun x -> (), x)
let remove id db =
let (Db dict) = db
dict
|> Map.remove id
|> Db
|> (fun x -> (), x)
type GetByIdCapability =
| GetByIdCapability of ? (Id -> Value * ?) ?
type AddValueCapability =
| AddValueCapability of ? (Id -> Value -> ?) ?
type RemoveByIdCapability =
| RemoveByIdCapability of ? (Id -> ?) ?
type CreateAddValueCapability =
| CreateAddValueCapability of (Db -> AddValueCapability)
type AddValueService =
{
AddValueCapability: AddValueCapability
}
let createAddValueService db (CreateAddValueCapability createAddValueCapabilityFunc) =
let addValueCapability = db |> createAddValueCapabilityFunc
{
AddValueCapability = addValueCapability
}
let addValue id value (addValueService: AddValueService) =
addValueService.AddValueCapability ?
What I want is to have AddValueService
which must have access only to "add value to Db" capability and has no access to other functions of Db inside service's logic. But at the same time I want to get updated instance of Db after calling service's logic. Is it possible to implement?