123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596open!BaseincludeObserver0letunmapt~f=create(funx~size~hash->observet(fx)~size~hash)letof_hash_foldf=create(funx~size:_~hash->fhashx)letof_lazylazy_t=create(funx~size~hash->observe(forcelazy_t)x~size~hash)letfixed_pointwrap=letreclazy_t=lazy(wrap(of_lazylazy_t))inof_lazylazy_t;;letunit=opaqueletbool=of_hash_foldBool.hash_fold_tletchar=of_hash_foldChar.hash_fold_tletint=of_hash_foldInt.hash_fold_tletint32=of_hash_foldInt32.hash_fold_tletint63=of_hash_foldInt63.hash_fold_tletint64=of_hash_foldInt64.hash_fold_tletnativeint=of_hash_foldNativeint.hash_fold_tletfloat=of_hash_foldFloat.hash_fold_tletstring=of_hash_foldString.hash_fold_tletsexp=of_hash_foldSexp.hash_fold_tletbigstring=of_hash_fold(Bigarray_helpers.Array1.hash_foldhash_fold_char)letfloat32_vec=of_hash_fold(Bigarray_helpers.Array1.hash_foldhash_fold_float)letfloat64_vec=of_hash_fold(Bigarray_helpers.Array1.hash_foldhash_fold_float)letfloat32_mat=of_hash_fold(Bigarray_helpers.Array2.hash_foldhash_fold_float)letfloat64_mat=of_hash_fold(Bigarray_helpers.Array2.hash_foldhash_fold_float)letbytes=unmapstring~f:Bytes.to_stringleteitherfst_tsnd_t=create(funeither~size~hash->match(either:_Either.t)with|Firstfst->observefst_tfst~size~hash:(hash_fold_inthash1)|Secondsnd->observesnd_tsnd~size~hash:(hash_fold_inthash2));;letresultok_terr_t=unmap(eitherok_terr_t)~f:(function|Okok->Firstok|Errorerr->Seconderr);;letbothfst_tsnd_t=create(fun(fst,snd)~size~hash->lethash=observefst_tfst~size~hashinlethash=observesnd_tsnd~size~hashinhash);;letoptionvalue_t=unmap(eitheropaquevalue_t)~f:(function|None->First()|Somevalue->Secondvalue);;letlistelt_t=create(funlist~size~hash->letrandom=Splittable_random.State.of_int(Hash.get_hash_valuehash)inletlength=List.lengthlistinletsizes=Generator.sizes~min_length:length~max_length:length()|>Generator.generate~size~randominList.fold2_exnlistsizes~init:(hash_fold_inthash0)~f:(funhasheltsize->observeelt_telt~size~hash:(hash_fold_inthash1)));;letarrayt=unmap(listt)~f:Array.to_listletreft=unmapt~f:Ref.(!)letlazy_tt=unmapt~f:Lazy.forceletfndomrng=create(funf~size~hash->letrandom=Splittable_random.State.of_int(Hash.get_hash_valuehash)inletsizes=(* Empirically, doubling the size when generating the list of inputs gives us much
better coverage of the space of functions. *)Generator.generate(Generator.sizes())~size:(size*2)~randominList.foldsizes~init:hash~f:(funhashsize->letx=Generator.generatedom~size~randominobserverng(fx)~size~hash));;letmap_treekey_obsdata_obs=unmap(list(bothkey_obsdata_obs))~f:Map.Using_comparator.Tree.to_alist;;letset_treeelt_obs=unmap(listelt_obs)~f:Set.Using_comparator.Tree.to_listletmap_tkey_obsdata_obs=unmap(map_treekey_obsdata_obs)~f:Map.Using_comparator.to_tree;;letset_telt_obs=unmap(set_treeelt_obs)~f:Set.Using_comparator.to_tree