A VectorClock implementation, supporting total ordering by using unix timestamp + actorID for breaking ties. Clocks are implemented as non-mutable struct, incrementing and merging always returns a new clock.
let clock = VectorClock(actorID: "A")
let incrementedClock = clock.incrementing("B")
let clockA = VectorClock(actorID: "A")
let clockB = VectorClock(actorID: "B")
let mergedClock = clockA.merging(clockB)
let clockA = VectorClock(actorID: "A")
let clockB = VectorClock(actorID: "B")
let isAscending = clockA.totalOrder(other: clockB) // .ascending
let clockA = VectorClock(actorID: "A")
let clockB = VectorClock(actorID: "B")
let partialOrder = clockA.partialOrder(other: clockB) // .concurrent