From a893e6c0eb9830121b3adf48ecf42185f3cc60f3 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Wed, 15 May 2013 16:41:32 +0200 Subject: [PATCH] 4-ary and 5-ary tuples in Bij --- bij.ml | 43 +++++++++++++++++++++++++++++++++++++++++++ bij.mli | 2 ++ 2 files changed, 45 insertions(+) diff --git a/bij.ml b/bij.ml index 095fa2e7..d8038505 100644 --- a/bij.ml +++ b/bij.ml @@ -36,6 +36,8 @@ type _ t = | Opt : 'a t -> 'a option t | Pair : 'a t * 'b t -> ('a * 'b) t | Triple : 'a t * 'b t * 'c t -> ('a * 'b * 'c) t + | Quad : 'a t * 'b t * 'c t * 'd t -> ('a * 'b * 'c * 'd) t + | Quint : 'a t * 'b t * 'c t * 'd t * 'e t -> ('a * 'b * 'c * 'd * 'e) t | Guard : ('a -> bool) * 'a t -> 'a t | Map : ('a -> 'b) * ('b -> 'a) * 'b t -> 'a t | Switch : ('a -> char * 'a inject_branch) * (char -> 'a extract_branch) -> 'a t @@ -58,6 +60,8 @@ let many l = Many l let opt t = Opt t let pair a b = Pair(a,b) let triple a b c = Triple (a,b,c) +let quad a b c d = Quad (a, b, c, d) +let quint a b c d e = Quint (a, b, c, d, e) let guard f t = Guard (f, t) let map ~inject ~extract b = Map (inject, extract, b) @@ -289,6 +293,28 @@ module SexpEncode(Sink : SINK) = struct Sink.write_char sink ' '; encode bij_c c; Sink.write_char sink ')' + | Quad (bij_a, bij_b, bij_c, bij_d), (a, b, c, d) -> + Sink.write_char sink '('; + encode bij_a a; + Sink.write_char sink ' '; + encode bij_b b; + Sink.write_char sink ' '; + encode bij_c c; + Sink.write_char sink ' '; + encode bij_d d; + Sink.write_char sink ')' + | Quint (bij_a, bij_b, bij_c, bij_d, bij_e), (a, b, c, d, e) -> + Sink.write_char sink '('; + encode bij_a a; + Sink.write_char sink ' '; + encode bij_b b; + Sink.write_char sink ' '; + encode bij_c c; + Sink.write_char sink ' '; + encode bij_d d; + Sink.write_char sink ' '; + encode bij_e e; + Sink.write_char sink ')' | Map (inject, _, bij'), x -> let y = inject x in encode bij' y @@ -362,6 +388,23 @@ module SexpDecode(Source : SOURCE) = struct let c = decode bijc in decode_close (); a, b, c + | Quad (bija, bijb, bijc, bijd) -> + decode_open (); + let a = decode bija in + let b = decode bijb in + let c = decode bijc in + let d = decode bijd in + decode_close (); + a, b, c, d + | Quint (bija, bijb, bijc, bijd, bije) -> + decode_open (); + let a = decode bija in + let b = decode bijb in + let c = decode bijc in + let d = decode bijd in + let e = decode bije in + decode_close (); + a, b, c, d, e | Guard (check, bij') -> let x = decode bij' in (if not (check x) then raise (DecodingError "check failed")); diff --git a/bij.mli b/bij.mli index 1abc6165..14dc0525 100644 --- a/bij.mli +++ b/bij.mli @@ -40,6 +40,8 @@ val many : 'a t -> 'a list t (* non empty *) val opt : 'a t -> 'a option t val pair : 'a t -> 'b t -> ('a * 'b) t val triple : 'a t -> 'b t -> 'c t -> ('a * 'b * 'c) t +val quad : 'a t -> 'b t -> 'c t -> 'd t -> ('a * 'b * 'c * 'd) t +val quint : 'a t -> 'b t -> 'c t -> 'd t -> 'e t -> ('a * 'b * 'c * 'd * 'e) t val guard : ('a -> bool) -> 'a t -> 'a t (** Validate values at encoding and decoding *)