123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170moduleIl=Lang.IlmoduleVCache=Runtime.Dynamic.Caches.ValueCachemoduleMCache=Domain.Caches.MixopCache(* Cache instance *)typecache={mutableenabled:bool;boot_mixop:Il.valueMCache.t;boot_value:Il.valueVCache.t;boot_value_pingpong:Il.valueVCache.t;unboot_mixop:Il.mixopVCache.t;unboot_typ:Il.typVCache.t;unboot_value:Il.valueVCache.t;unboot_value_pingpong:Il.valueVCache.t;}(* Boot caches *)letfind_boot_mixop_cache:(Il.mixop->Il.valueoption)ref=ref(fun_->None)letadd_boot_mixop_cache:(Il.mixop->Il.value->unit)ref=ref(fun__->())letfind_boot_value_cache:(Il.value->Il.valueoption)ref=ref(fun_->None)letadd_boot_value_cache:(Il.value->Il.value->unit)ref=ref(fun__->())letfind_boot_value_pingpong_cache:(Il.value->Il.valueoption)ref=ref(fun_->None)letadd_boot_value_pingpong_cache:(Il.value->Il.value->unit)ref=ref(fun__->())(* Unboot caches *)letfind_unboot_mixop_cache:(Il.value->Il.mixopoption)ref=ref(fun_->None)letadd_unboot_mixop_cache:(Il.value->Il.mixop->unit)ref=ref(fun__->())letfind_unboot_typ_cache:(Il.value->Il.typoption)ref=ref(fun_->None)letadd_unboot_typ_cache:(Il.value->Il.typ->unit)ref=ref(fun__->())letfind_unboot_value_cache:(Il.value->Il.valueoption)ref=ref(fun_->None)letadd_unboot_value_cache:(Il.value->Il.value->unit)ref=ref(fun__->())letfind_unboot_value_pingpong_cache:(Il.value->Il.valueoption)ref=ref(fun_->None)letadd_unboot_value_pingpong_cache:(Il.value->Il.value->unit)ref=ref(fun__->())(* Setter and unsetter *)letmake_cache():cache={enabled=true;boot_mixop=MCache.create~size:4096;boot_value=VCache.create~size:4096;boot_value_pingpong=VCache.create~size:(256*1024);unboot_mixop=VCache.create~size:4096;unboot_typ=VCache.create~size:4096;unboot_value=VCache.create~size:4096;unboot_value_pingpong=VCache.create~size:(256*1024);}letcache_enable(cache:cache):unit=cache.enabled<-trueletcache_disable_reset(cache:cache):unit=cache.enabled<-false;MCache.emptycache.boot_mixop;VCache.emptycache.boot_value;VCache.emptycache.boot_value_pingpong;VCache.emptycache.unboot_mixop;VCache.emptycache.unboot_typ;VCache.emptycache.unboot_value;VCache.emptycache.unboot_value_pingpongletcache_clear(cache:cache):unit=MCache.emptycache.boot_mixop;VCache.emptycache.boot_value;VCache.emptycache.boot_value_pingpong;VCache.emptycache.unboot_mixop;VCache.emptycache.unboot_typ;VCache.emptycache.unboot_value;VCache.emptycache.unboot_value_pingpong(* Stack of caches, where the stack is pushed along calls that climb tower levels,
and popped along call returns that descend tower levels *)letstack:cacheoptionlistref=ref[]letcurr:cacheoptionref=refNoneletinstall_none():unit=(find_boot_mixop_cache:=fun_->None);(add_boot_mixop_cache:=fun__->());(find_boot_value_cache:=fun_->None);(add_boot_value_cache:=fun__->());(find_boot_value_pingpong_cache:=fun_->None);(add_boot_value_pingpong_cache:=fun__->());(find_unboot_mixop_cache:=fun_->None);(add_unboot_mixop_cache:=fun__->());(find_unboot_typ_cache:=fun_->None);(add_unboot_typ_cache:=fun__->());(find_unboot_value_cache:=fun_->None);(add_unboot_value_cache:=fun__->());(find_unboot_value_pingpong_cache:=fun_->None);add_unboot_value_pingpong_cache:=fun__->()letinstall_some(cache:cache):unit=(find_boot_mixop_cache:=funmixop->MCache.findcache.boot_mixopmixop);(add_boot_mixop_cache:=funmixopvalue->MCache.addcache.boot_mixopmixopvalue);(find_boot_value_cache:=funvalue->VCache.findcache.boot_valuevalue);(add_boot_value_cache:=funvalueresult->VCache.addcache.boot_valuevalueresult);(find_boot_value_pingpong_cache:=funvalue->VCache.findcache.boot_value_pingpongvalue);(add_boot_value_pingpong_cache:=funvalueresult->VCache.addcache.boot_value_pingpongvalueresult);(find_unboot_mixop_cache:=funvalue_mixop->VCache.findcache.unboot_mixopvalue_mixop);(add_unboot_mixop_cache:=funvalue_mixopmixop->VCache.addcache.unboot_mixopvalue_mixopmixop);(find_unboot_typ_cache:=funvalue_typ->VCache.findcache.unboot_typvalue_typ);(add_unboot_typ_cache:=funvalue_typtyp->VCache.addcache.unboot_typvalue_typtyp);(find_unboot_value_cache:=funvalue_value->VCache.findcache.unboot_valuevalue_value);(add_unboot_value_cache:=funvalue_valuevalue->VCache.addcache.unboot_valuevalue_valuevalue);(find_unboot_value_pingpong_cache:=funvalue_value->VCache.findcache.unboot_value_pingpongvalue_value);add_unboot_value_pingpong_cache:=funvalue_valuevalue->VCache.addcache.unboot_value_pingpongvalue_valuevalueletinstall(cache_opt:cacheoption):unit=matchcache_optwith|None->install_none()|Somecache->install_somecacheletpush_cache(cache:cache):unit=stack:=!curr::!stack;letnext=ifcache.enabledthenSomecacheelseNoneincurr:=next;installnextletpop_cache():unit=letprev=match!stackwith|[]->None|prev::rest->stack:=rest;previncurr:=prev;installprev