aboutsummaryrefslogtreecommitdiffstats
path: root/lib/protocols/Journal.ml
blob: 392eb5aa12ea76b59548316a04e02adeb0faa466 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
type change = {name: string; expected: Handle.t option; replacement: Handle.t option}
type commit = {number: int; snapshot: Handle.t; changed: string list}
type proposal = {previous: commit; proposed: commit}
type guard = proposal -> (unit, Concepts.Condition.condition) result
type observer = commit -> unit

class type implementation = object
  method commit : change list -> (commit option, Concepts.Condition.condition) result
  method head : commit
  method history : commit list
  method guard : string -> guard option -> unit
  method observe : string -> observer option -> unit
end

type Handle.protocol += Journal of implementation
type t = implementation

let make impl = Journal (impl :> implementation)
let from handle = Handle.into handle (function Journal impl -> Some impl | _ -> None)
let require = Handle.require from
let commit i changes = Handle.invoke i (fun o -> o#commit changes)
let head i = Handle.invoke i (fun o -> o#head)
let history i = Handle.invoke i (fun o -> o#history)
let guard i name g = Handle.invoke i (fun o -> o#guard name g)
let observe i name f = Handle.invoke i (fun o -> o#observe name f)