123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120(**
* cache.ml
*
* a module for KaSim
* Jérôme Feret, projet Abstraction, INRIA Paris-Rocquencourt
* Jean Krivine, Université Paris-Diderot, CNRS
*
* KaSim
* Jean Krivine, Université Paris-Diderot, CNRS
*
* Creation: 27/03/2012
* Last modification: 27/03/2012
* *
*
* It uses imperative styles to ensure compatibility with other modules
*
* Copyright 2011,2012 Institut National de Recherche en Informatique et
* en Automatique. All rights reserved. This file is distributed
* under the terms of the GNU Library General Public License *)moduletypeCache=sigmoduleO:SetMap.OrderedTypetypetvallast:t->O.toptionvalcreate:intoption->tvaladd:O.t->t->tvalfold:(O.t->'a->'a)->t->'a->'avaliter:(O.t->unit)->t->unitendmoduleCache=functor(OO:SetMap.OrderedType)->(structmoduleO=OOmoduleSM=SetMap.Make(O)moduleS=SM.Settypefinite_cache={size:int;offset:int;cache:O.toptionarray;bag:S.t;last:O.toption;}letcreate_finiten={size=n;offset=0;cache=Array.makenNone;bag=S.empty;last=None;}letnextt=letoffset=t.offsetinifoffset=t.size-1then{twithoffset=0}else{twithoffset=offset+1}letadd_finitekeyt=lett={twithlast=Somekey}inifS.memkeyt.bagthentelse(lett={twithbag=S.addkeyt.bag}inlett=nexttinletoverwritten_value=t.cache.(t.offset)inlett=matchoverwritten_valuewith|None->t|Someoverwritten_value->{twithbag=S.removeoverwritten_valuet.bag}inlet_=t.cache.(t.offset)<-Somekeyint)letlast_finitet=t.lasttypeinfinite_cache={inf_bag:S.t;last:O.toption}typet=Finiteoffinite_cache|Infiniteofinfinite_cacheletcreate_infinite={inf_bag=S.empty;last=None}letadd_infinitekeyt={inf_bag=S.addkeyt.inf_bag;last=Somekey}letcreatesize=matchsizewith|None->Infinitecreate_infinite|Somea->Finite(create_finitea)letlastt=matchtwith|Finitet->last_finitet|Infinitet->t.lastletaddkeyt=matchtwith|Finitet->Finite(add_finitekeyt)|Infinitet->Infinite(add_infinitekeyt)letfoldfta=matchtwith|Finitet->S.foldft.baga|Infinitet->S.foldft.inf_bagaletiterft=matchtwith|Finitet->S.iterft.bag|Infinitet->S.iterft.inf_bagend:CachewithtypeO.t=OO.t)