(**************************************************************************) (* *) (* Copyright (c) 2014 - 2018. *) (* Dynamic Ledger Solutions, Inc. *) (* *) (* All rights reserved. No warranty, explicit or implicit, provided. *) (* *) (**************************************************************************) type t = { name : string ; major : int ; minor : int ; } let pp ppf { name ; major ; minor } = Format.fprintf ppf "%s.%d.%d" name major minor let encoding = let open Data_encoding in conv (fun { name; major; minor } -> (name, major, minor)) (fun (name, major, minor) -> { name; major; minor }) (obj3 (req "name" string) (req "major" int8) (req "minor" int8)) (* the common version for a pair of peers, if any, is the maximum one, in lexicographic order *) let common la lb = let la = List.sort (fun l r -> compare r l) la in let lb = List.sort (fun l r -> compare r l) lb in let rec find = function | [], _ | _, [] -> None | ((a :: ta) as la), ((b :: tb) as lb) -> if a = b then Some a else if a < b then find (ta, lb) else find (la, tb) in find (la, lb)