cache2states_2params<Result, State1, State2, Param1, Param2> function
F2_2<Result, State1, State2, Param1, Param2>
cache2states_2params<Result, State1, State2, Param1, Param2>(
- F2_2<
Result, State1, State2, Param1, Param2> f
Cache for 2 immutable states, and 2 parameters.
Implementation
F2_2<Result, State1, State2, Param1, Param2> //
cache2states_2params<Result, State1, State2, Param1, Param2>(
F2_2<Result, State1, State2, Param1, Param2> f) {
StateContainer? _s1, _s2;
late WeakMap<State1, WeakMap<State2, Map<_Pair<Param1, Param2>, Result>>> weakMap1;
return (State1 s1, State2 s2) {
return (Param1 p1, Param2 p2) {
var pair = _Pair(p1, p2);
if (_s1 == null || !_s1!.contains(s1) || !_s2!.contains(s2)) {
_s1 = StateContainer(s1);
_s2 = StateContainer(s2);
weakMap1 = WeakMap();
WeakMap<State2, Map<_Pair<Param1, Param2>, Result>> weakMap2 = WeakMap();
Map<_Pair<Param1, Param2>, Result> map = HashMap();
weakMap2[s2] = map;
weakMap1[s1] = weakMap2;
var result = f(s1, s2)(p1, p2);
map[pair] = result;
return result;
}
//
else {
Map<_Pair<Param1, Param2>, Result> map = weakMap1[s1]![s2]!;
if (!map.containsKey(pair)) {
var result = f(s1, s2)(p1, p2);
map[pair] = result;
return result;
}
return map[pair] as Result;
}
};
};
}