123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596letrecbiniou_of_json=function`Null->`Unit|`Boolb->`Boolb|`Inti->`Svinti|`Intliti->failwith"Cannot convert big int to biniou"|`Floatf->`Float64f|`Strings->`Strings|`Assocl->leta=Array.map(fun(s,x)->(Somes,Bi_io.hash_names,biniou_of_jsonx))(Array.of_listl)in`Recorda|`Listl->(matchlwith[]->`ArrayNone|l->leta=Array.mapbiniou_of_json(Array.of_listl)inlettag=Bi_io.tag_of_treea.(0)intryfori=1toArray.lengtha-1doifBi_io.tag_of_treea.(i)<>tagthenraiseExitdone;`Array(Some(tag,a))withExit->failwith"Cannot convert heterogenous array to biniou")|`Tuplel->`Tuple(Array.mapbiniou_of_json(Array.of_listl))|`Variant(s,o)->leto=matchowithNone->None|Somex->Some(biniou_of_jsonx)in`Variant(Somes,Bi_io.hash_names,o)letrecjson_of_biniou(x:Bi_io.tree)=matchxwith`Unit->`Null|`Boolb->`Boolb|`Int8_->failwith"Cannot convert int8 to JSON"|`Int16_->failwith"Cannot convert int16 to JSON"|`Int32_->failwith"Cannot convert int32 to JSON"|`Int64_->failwith"Cannot convert int64 to JSON"|`Float32f|`Float64f->`Floatf|`Uvinti->failwith"Cannot convert uvint to JSON"|`Svinti->`Inti|`Strings->`Strings|`ArrayNone->`List[]|`Array(Some(_,a))->`List(Array.to_list(Array.mapjson_of_binioua))|`Tuplea->`Tuple(Array.to_list(Array.mapjson_of_binioua))|`Recorda->`Assoc(Array.to_list(Array.map(function(Somes,_,x)->(s,json_of_binioux)|(None,_,_)->failwith"Cannot convert hashed field name to JSON")a))|`Num_variant_->failwith"Cannot convert num_variant to JSON"|`Variant(Somes,_,Somex)->`Variant(s,Some(json_of_binioux))|`Variant(Somes,_,None)->`Variant(s,None)|`Variant(None,_,_)->failwith"Cannot convert hashed variant name to JSON"|`TableNone->`List[](* not reversible *)|`Table(Some(header,rows))->(* not reversible *)`List(Array.to_list(Array.map(json_of_rowheader)rows))|`Shared_->failwith"Cannot convert shared node to JSON"andjson_of_rowheadera=letn=Array.lengthheaderinifArray.lengtha<>nthenfailwith"Malformed biniou table";letl=ref[]infori=n-1downto0doleto,_,_=header.(i)inletx=a.(i)inmatchowithNone->failwith"Cannot convert hashed field name to JSON"|Somes->l:=(s,json_of_binioux)::!ldone;`Assoc!l