sig   type t =     | Set of Key_in_collection.t * string     | Unset of Key_in_collection.t     | Sequence of t list     | Check of Key_in_collection.t * string option     
    (** An action is a transaction that (attempts) to modify the database. *)
  val set : ?collection:string -> key:string -> string -> t   
  (** Create a “set” action: set ~key v will add or set the value v for the key key, optionally in the collection collection. *)
  val seq : t list -> t   
  (** Put a sequence of actions into a transaction. *)
  val contains : ?collection:string -> key:string -> string -> t   
  (** An action that checks that the key is set in the DB and has the given value. *)
  val is_not_set : ?collection:string -> string -> t   
  (** An action that checks that the key is not set in the DB. *)
  val unset: ?collection:string -> string -> t   
  (** An actions that removes a value from the DB. *)
  val to_string: t -> string   
  (** Convert the action to a display friendly string (the implementation is quite naive and not tail-recursive, hence avoid displaying huge transaction). *)
end = struct   type t =     | Set of Key_in_collection.t * string     | Unset of Key_in_collection.t     | Sequence of t list     | Check of Key_in_collection.t * string option   let _key ?collection key = {Key_in_collection. key; collection}   let set ?collection ~key value = Set (_key ?collection key, value)   let seq l = Sequence l   let contains ?collection ~key v = Check (_key ?collection key, Some v)    let is_not_set ?collection key = Check (_key ?collection key, None)   let unset ?collection key = Unset (_key ?collection key)   let rec to_string (t: t) =     match t with     | Set (k, v) -> sprintf "(set %s %S)" (Key_in_collection.to_string k) v     | Unset k -> sprintf "(unset %s)" (Key_in_collection.to_string k)     | Sequence l -> sprintf "(sequence %s)" (List.map l ~f:to_string                                              |> StringLabels.concat ~sep:" ")     | Check (k, v) ->       sprintf "(check %s %s)" (Key_in_collection.to_string k)         (Option.value_map ~default:"None" v ~f:(sprintf "(Some %S)")) end