1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192(*****************************************************************************)(* *)(* Open Source License *)(* Copyright (c) 2021 Nomadic Labs <contact@nomadic-labs.com> *)(* *)(* Permission is hereby granted, free of charge, to any person obtaining a *)(* copy of this software and associated documentation files (the "Software"),*)(* to deal in the Software without restriction, including without limitation *)(* the rights to use, copy, modify, merge, publish, distribute, sublicense, *)(* and/or sell copies of the Software, and to permit persons to whom the *)(* Software is furnished to do so, subject to the following conditions: *)(* *)(* The above copyright notice and this permission notice shall be included *)(* in all copies or substantial portions of the Software. *)(* *)(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*)(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *)(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *)(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*)(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *)(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *)(* DEALINGS IN THE SOFTWARE. *)(* *)(*****************************************************************************)(** Cache structures used to memoize costly RPCs/computations. *)openProtocol.Alpha_contexttyperound=Round.tmoduleBlock_cache=Aches.Vache.Map(Aches.Vache.LRU_Precise)(Aches.Vache.Strong)(Block_hash)(** The [Timestamp_of_round_tbl] module allows to create memoization tables
to store function calls of [Round.timestamp_of_round]. *)moduleTimestamp_of_round_cache=Aches.Vache.Map(Aches.Vache.LRU_Precise)(Aches.Vache.Strong)(struct(* The type of keys is a tuple that corresponds to the arguments
of [Round.timestamp_of_round]. *)typet=Timestamp.time*round*roundlethashk=Hashtbl.hashkletequal(ts,r1,r2)(ts',r1',r2')=Timestamp.(ts=ts')&&Round.(r1=r1')&&Round.(r2=r2')end)moduleRound_cache_key=structtypets_interval=Timestamp.time*Timestamp.time(** The values that are intended to be used here are the
arguments are: predecessor_timestamp * predecessor_round *
timestamp_interval *)typet={predecessor_timestamp:Timestamp.time;predecessor_round:round;time_interval:ts_interval;}lethash{predecessor_timestamp;predecessor_round;_}=Stdlib.Hashtbl.hash(predecessor_timestamp,predecessor_round)letequal{predecessor_timestamp=pred_t;predecessor_round=pred_r;time_interval=t_beg,t_end;}{predecessor_timestamp=pred_t';predecessor_round=pred_r';time_interval=t_beg',t_end';}=Timestamp.(pred_t=pred_t')&&Round.(pred_r=pred_r')&&Timestamp.(t_beg'<=t_beg)&&Timestamp.(t_end<t_end')endmoduleRound_timestamp_interval_cache=Aches.Vache.Map(Aches.Vache.LRU_Precise)(Aches.Vache.Strong)(Round_cache_key)moduleCycle_cache=Aches.Vache.Map(Aches.Vache.LRU_Precise)(Aches.Vache.Strong)(structincludeCyclelethash=Hashtbl.hashend)