cache2states_2params<Result, State1, State2, Param1, Param2> function

F2_2<Result, State1, State2, Param1, Param2> cache2states_2params<Result, State1, State2, Param1, Param2>(
  1. 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;
      }
    };
  };
}