123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217open!Coreopen!ImportmoduleConstant_id=Unique_id.Int()type_without_position=|Constant:'a*Constant_id.t->'awithout_position|Incr:'aIncr.t->'awithout_position|Named:'aType_equal.Id.t->'awithout_position|Both:'at*'bt->('a*'b)without_position|Cutoff:{t:'at;equal:'a->'a->bool}->'awithout_position|Map:{t:'at;f:'a->'b}->'bwithout_position|Map2:{t1:'t1t;t2:'t2t;f:'t1->'t2->'r}->'rwithout_position|Map3:{t1:'t1t;t2:'t2t;t3:'t3t;f:'t1->'t2->'t3->'r}->'rwithout_position|Map4:{t1:'t1t;t2:'t2t;t3:'t3t;t4:'t4t;f:'t1->'t2->'t3->'t4->'r}->'rwithout_position|Map5:{t1:'t1t;t2:'t2t;t3:'t3t;t4:'t4t;t5:'t5t;f:'t1->'t2->'t3->'t4->'t5->'r}->'rwithout_position|Map6:{t1:'t1t;t2:'t2t;t3:'t3t;t4:'t4t;t5:'t5t;t6:'t6t;f:'t1->'t2->'t3->'t4->'t5->'t6->'r}->'rwithout_position|Map7:{t1:'t1t;t2:'t2t;t3:'t3t;t4:'t4t;t5:'t5t;t6:'t6t;t7:'t7t;f:'t1->'t2->'t3->'t4->'t5->'t6->'t7->'r}->'rwithout_positionand'at={value:'awithout_position;here:Source_code_position.toption}letrecsexp_of_t:typea.at->Sexp.t=fun{value;_}->matchvaluewith|Constant_->[%sexp"constant"]|Cutoff{t;equal=_}->[%sexp"cutoff",(t:t)]|Incr_->[%sexp"incr"]|Namedid->[%sexp"named",(Type_equal.Id.nameid:string)]|Map{t;f=_}->[%message"map"(t:t)]|Both(t1,t2)->[%message"both"(t1:t)(t2:t)]|Map2{t1;t2;f=_}->[%message"map2"(t1:t)(t2:t)]|Map3{t1;t2;t3;f=_}->[%message"map3"(t1:t)(t2:t)(t3:t)]|Map4{t1;t2;t3;t4;f=_}->[%message"map4"(t1:t)(t2:t)(t3:t)(t4:t)]|Map5{t1;t2;t3;t4;t5;f=_}->[%message"map5"(t1:t)(t2:t)(t3:t)(t4:t)(t5:t)]|Map6{t1;t2;t3;t4;t5;t6;f=_}->[%message"map6"(t1:t)(t2:t)(t3:t)(t4:t)(t5:t)(t6:t)]|Map7{t1;t2;t3;t4;t5;t6;t7;f=_}->[%message"map7"(t1:t)(t2:t)(t3:t)(t4:t)(t5:t)(t6:t)(t7:t)];;letmap2t1t2~f={value=Map2{t1;t2;f};here=None}letmapt~f={value=Map{t;f};here=None}letnamedn={value=Namedn;here=None}letcutoff~equalt={value=Cutoff{t;equal};here=None}letreceval:typea.Environment.t->at->aIncr.t=funenv{value;_}->matchvaluewith|Incrx->x|Cutoff{t;equal}->lett=evalenvtinIncremental.set_cutofft(Incremental.Cutoff.of_equalequal);t|Constant(x,_id)->Incr.returnx|Namedname->(matchEnvironment.findenvnamewith|Someincremental->incremental|None->failwith"A Value.t was used outside of the scope that it was declared in! Make sure that \
you aren't storing any Value.t inside a ref!")|Both(t1,t2)->Incr.both(evalenvt1)(evalenvt2)|Map{t;f}->Incr.map(evalenvt)~f|Map2{t1;t2;f}->Incr.map2(evalenvt1)(evalenvt2)~f|Map3{t1;t2;t3;f}->Incr.map3(evalenvt1)(evalenvt2)(evalenvt3)~f|Map4{t1;t2;t3;t4;f}->Incr.map4(evalenvt1)(evalenvt2)(evalenvt3)(evalenvt4)~f|Map5{t1;t2;t3;t4;t5;f}->Incr.map5(evalenvt1)(evalenvt2)(evalenvt3)(evalenvt4)(evalenvt5)~f|Map6{t1;t2;t3;t4;t5;f;t6}->Incr.map6~f(evalenvt1)(evalenvt2)(evalenvt3)(evalenvt4)(evalenvt5)(evalenvt6)|Map7{t1;t2;t3;t4;t5;f;t6;t7}->Incr.map7~f(evalenvt1)(evalenvt2)(evalenvt3)(evalenvt4)(evalenvt5)(evalenvt6)(evalenvt7);;letevalenvt=letincr=evalenvtinannotateValueincr;incr;;letreturna={value=Constant(a,Constant_id.create());here=None}includeApplicative.Make_using_map2(structtypenonrec'at='atletreturn=returnletmap2=map2letmap=`Custommapend)letbothab={value=Both(a,b);here=None}letmap3t1t2t3~f={value=Map3{t1;t2;t3;f};here=None}letmap4t1t2t3t4~f={value=Map4{t1;t2;t3;t4;f};here=None}letmap5t1t2t3t4t5~f={value=Map5{t1;t2;t3;t4;t5;f};here=None}letmap6t1t2t3t4t5t6~f={value=Map6{t1;t2;t3;t4;t5;t6;f};here=None};;letmap7t1t2t3t4t5t6t7~f={value=Map7{t1;t2;t3;t4;t5;t6;t7;f};here=None};;letrecall=function|[]->return[]|[t1]->mapt1~f:(funa1->[a1])|[t1;t2]->map2t1t2~f:(funa1a2->[a1;a2])|[t1;t2;t3]->map3t1t2t3~f:(funa1a2a3->[a1;a2;a3])|[t1;t2;t3;t4]->map4t1t2t3t4~f:(funa1a2a3a4->[a1;a2;a3;a4])|[t1;t2;t3;t4;t5]->map5t1t2t3t4t5~f:(funa1a2a3a4a5->[a1;a2;a3;a4;a5])|[t1;t2;t3;t4;t5;t6]->map6t1t2t3t4t5t6~f:(funa1a2a3a4a5a6->[a1;a2;a3;a4;a5;a6])|[t1;t2;t3;t4;t5;t6;t7]->map7t1t2t3t4t5t6t7~f:(funa1a2a3a4a5a6a7->[a1;a2;a3;a4;a5;a6;a7])|t1::t2::t3::t4::t5::t6::t7::rest->letleft=map7t1t2t3t4t5t6t7~f:(funa1a2a3a4a5a6a7->[a1;a2;a3;a4;a5;a6;a7])inletright=allrestinmap2leftright~f:(funleftright->left@right);;letof_incrx={value=Incrx;here=None}moduleOpen_on_rhs_intf=structmoduletypeS=sigendendmoduleLet_syntax=structletreturn=returnincludeApplicative_infixmoduleLet_syntax=structletreturn=returnletmap=mapletboth=bothmoduleOpen_on_rhs=structendendend