From 1f30f804120768d205a4fd34a19a0cf2ec273452 Mon Sep 17 00:00:00 2001 From: TheLastGimbus Date: Thu, 18 Feb 2021 15:21:57 +0100 Subject: [PATCH 01/10] Init example --- example/.gitignore | 9 +++++++++ example/README.md | 1 + example/bin/example.dart | 3 +++ example/pubspec.yaml | 9 +++++++++ 4 files changed, 22 insertions(+) create mode 100644 example/.gitignore create mode 100644 example/README.md create mode 100644 example/bin/example.dart create mode 100644 example/pubspec.yaml diff --git a/example/.gitignore b/example/.gitignore new file mode 100644 index 0000000..3d64647 --- /dev/null +++ b/example/.gitignore @@ -0,0 +1,9 @@ +# Files and directories created by pub +.dart_tool/ +.packages + +# Conventional directory for build outputs +build/ + +# Directory created by dartdoc +doc/api/ diff --git a/example/README.md b/example/README.md new file mode 100644 index 0000000..d482b5a --- /dev/null +++ b/example/README.md @@ -0,0 +1 @@ +A simple example showcase of memoize library diff --git a/example/bin/example.dart b/example/bin/example.dart new file mode 100644 index 0000000..d721de6 --- /dev/null +++ b/example/bin/example.dart @@ -0,0 +1,3 @@ +void main(List arguments) { + print('Hello world!'); +} diff --git a/example/pubspec.yaml b/example/pubspec.yaml new file mode 100644 index 0000000..af20dc8 --- /dev/null +++ b/example/pubspec.yaml @@ -0,0 +1,9 @@ +name: example +description: Example showcase of memoize library + +environment: + sdk: '>=2.0.0-dev <3.0.0' + +dependencies: + memoize: + path: ../ From 659ac74baa06d9688635e4015f22e76cef26de43 Mon Sep 17 00:00:00 2001 From: TheLastGimbus Date: Thu, 18 Feb 2021 17:11:29 +0100 Subject: [PATCH 02/10] Add some heavy calculations example --- example/bin/example.dart | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/example/bin/example.dart b/example/bin/example.dart index d721de6..c57d0cb 100644 --- a/example/bin/example.dart +++ b/example/bin/example.dart @@ -1,3 +1,32 @@ +import 'dart:math' as math; + +import 'package:memoize/memoize.dart'; + +num heavyCalc(num number) { + num sum = 0; + for (int x = 0; x < 999999; x++) { + sum += math.sqrt(number); + } + return sum; +} + void main(List arguments) { - print('Hello world!'); + print('Some heavy calculations done 99 times with 6 different inputs:'); + List numbers = [10000, 4206969, 777, 21372137, 99999999, 10000]; + var w = Stopwatch()..start(); + for (int x = 0; x < 99; x++) { + for (var n in numbers) { + heavyCalc(n); + } + } + print('\tNo cache: ${w.elapsedMilliseconds}ms'); + + w.reset(); + var cacheSqrt = memo1(heavyCalc); + for (int x = 0; x < 99; x++) { + for (var n in numbers) { + cacheSqrt(n); + } + } + print('\tWith cache: ${w.elapsedMilliseconds}ms'); } From 9ea4ae271a19f554d0f330a3a7e4785934c4d157 Mon Sep 17 00:00:00 2001 From: TheLastGimbus Date: Thu, 18 Feb 2021 17:32:36 +0100 Subject: [PATCH 03/10] First "multi input" function --- lib/memoize.dart | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/lib/memoize.dart b/lib/memoize.dart index 9980ecd..bdfe4ab 100644 --- a/lib/memoize.dart +++ b/lib/memoize.dart @@ -1,3 +1,5 @@ +import 'dart:collection'; + import 'function_defs.dart'; /// Lazy evaluates function and returns cached result on each call. @@ -20,19 +22,14 @@ Func0 memo0(Func0 func) { /// Checks 1 argument for equality with [==] operator and returns the cached /// result if it was not changed. Func1 memo1(Func1 func) { - A prevArg; - R prevResult; - bool isInitial = true; + HashMap argsToOutput = HashMap(); return ((A arg) { - if (!isInitial && arg == prevArg) { - return prevResult; + if (argsToOutput.containsKey(arg)) { + return argsToOutput[arg]; } else { - prevArg = arg; - prevResult = func(arg); - isInitial = false; - - return prevResult; + argsToOutput[arg] = func(arg); + return argsToOutput[arg]; } }); } From d9b63f317a495f31712c66483c4b4965e18a5561 Mon Sep 17 00:00:00 2001 From: TheLastGimbus Date: Sun, 22 Aug 2021 19:49:19 +0200 Subject: [PATCH 04/10] Write first function once again --- lib/memoize.dart | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/lib/memoize.dart b/lib/memoize.dart index d88bad1..961e376 100644 --- a/lib/memoize.dart +++ b/lib/memoize.dart @@ -1,3 +1,5 @@ +import 'dart:collection'; + import 'function_defs.dart'; /// Lazy evaluates function and returns cached result on each call. @@ -20,19 +22,14 @@ Func0 memo0(Func0 func) { /// Checks 1 argument for equality with [==] operator and returns the cached /// result if it was not changed. Func1 memo1(Func1 func) { - late A prevArg; - late R prevResult; - bool isInitial = true; + final argsToOutput = HashMap(); return ((A arg) { - if (!isInitial && arg == prevArg) { - return prevResult; + if (argsToOutput.containsKey(arg)) { + return argsToOutput[arg]!; } else { - prevArg = arg; - prevResult = func(arg); - isInitial = false; - - return prevResult; + argsToOutput[arg] = func(arg); + return argsToOutput[arg]!; } }); } From 4a42617cfe71b51d3c08031d39acd5bcd7eec594 Mon Sep 17 00:00:00 2001 From: TheLastGimbus Date: Sun, 22 Aug 2021 20:22:04 +0200 Subject: [PATCH 05/10] Update example --- example/bin/example.dart | 18 +++++++++++++----- example/pubspec.yaml | 2 +- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/example/bin/example.dart b/example/bin/example.dart index c57d0cb..0c2bc0c 100644 --- a/example/bin/example.dart +++ b/example/bin/example.dart @@ -11,22 +11,30 @@ num heavyCalc(num number) { } void main(List arguments) { - print('Some heavy calculations done 99 times with 6 different inputs:'); + const loops = 99; + print('Some heavy calculations done $loops times with 6 different inputs:'); List numbers = [10000, 4206969, 777, 21372137, 99999999, 10000]; + var sumNormal = 0.0; var w = Stopwatch()..start(); - for (int x = 0; x < 99; x++) { + for (int x = 0; x < loops; x++) { for (var n in numbers) { - heavyCalc(n); + sumNormal += heavyCalc(n); } } print('\tNo cache: ${w.elapsedMilliseconds}ms'); + var sumCache = 0.0; w.reset(); var cacheSqrt = memo1(heavyCalc); - for (int x = 0; x < 99; x++) { + for (int x = 0; x < loops; x++) { for (var n in numbers) { - cacheSqrt(n); + sumCache += cacheSqrt(n); } } print('\tWith cache: ${w.elapsedMilliseconds}ms'); + if (sumNormal == sumCache) { + print("...and results match!"); + } else { + print("...but results don't match... guess we broke something :D"); + } } diff --git a/example/pubspec.yaml b/example/pubspec.yaml index af20dc8..d5af34f 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -2,7 +2,7 @@ name: example description: Example showcase of memoize library environment: - sdk: '>=2.0.0-dev <3.0.0' + sdk: '>=2.12.0 <3.0.0' dependencies: memoize: From cbd1e1b6c06cfc148db871dc7e79a4261a1e247a Mon Sep 17 00:00:00 2001 From: TheLastGimbus Date: Sun, 22 Aug 2021 20:23:34 +0200 Subject: [PATCH 06/10] A way to support multiple arguments ...I hope --- lib/memoize.dart | 53 +++++++++++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/lib/memoize.dart b/lib/memoize.dart index 961e376..5b9f847 100644 --- a/lib/memoize.dart +++ b/lib/memoize.dart @@ -2,6 +2,18 @@ import 'dart:collection'; import 'function_defs.dart'; +// Stolen from flutter +// https://api.flutter.dev/flutter/foundation/listEquals.html +bool _listEquals(List? a, List? b) { + if (a == null) return b == null; + if (b == null || a.length != b.length) return false; + if (identical(a, b)) return true; + for (int index = 0; index < a.length; index += 1) { + if (a[index] != b[index]) return false; + } + return true; +} + /// Lazy evaluates function and returns cached result on each call. Func0 memo0(Func0 func) { late R prevResult; @@ -22,14 +34,19 @@ Func0 memo0(Func0 func) { /// Checks 1 argument for equality with [==] operator and returns the cached /// result if it was not changed. Func1 memo1(Func1 func) { - final argsToOutput = HashMap(); - - return ((A arg) { - if (argsToOutput.containsKey(arg)) { - return argsToOutput[arg]!; + final argsToOutput = HashMap( + equals: (a, b) => _listEquals(a, b), + hashCode: (list) => list[0].hashCode, + ); + + return ((A argA) { + final cached = argsToOutput[[argA]]; + if (cached != null) { + return cached; } else { - argsToOutput[arg] = func(arg); - return argsToOutput[arg]!; + final res = func(argA); + argsToOutput[[argA]] = res; + return res; } }); } @@ -37,21 +54,19 @@ Func1 memo1(Func1 func) { /// Checks 2 arguments for equality with [==] operator and returns the cached /// result if they were not changed. Func2 memo2(Func2 func) { - late A prevArgA; - late B prevArgB; - late R prevResult; - bool isInitial = true; + final argsToOutput = HashMap( + equals: (a, b) => _listEquals(a, b), + hashCode: (list) => list[0].hashCode ^ list[1].hashCode + ); return ((A argA, B argB) { - if (!isInitial && argA == prevArgA && argB == prevArgB) { - return prevResult; + final cached = argsToOutput[[argA, argB]]; + if (cached != null) { + return cached; } else { - prevArgA = argA; - prevArgB = argB; - prevResult = func(argA, argB); - isInitial = false; - - return prevResult; + final res = func(argA, argB); + argsToOutput[[argA, argB]] = res; + return res; } }); } From 2802c17471dfb00fca92689856a98c98e359af47 Mon Sep 17 00:00:00 2001 From: TheLastGimbus Date: Sun, 22 Aug 2021 20:54:19 +0200 Subject: [PATCH 07/10] Implement rest of functions I hope ;_; --- lib/memoize.dart | 311 +++++++++++++---------------------------------- 1 file changed, 84 insertions(+), 227 deletions(-) diff --git a/lib/memoize.dart b/lib/memoize.dart index 5b9f847..abd18ea 100644 --- a/lib/memoize.dart +++ b/lib/memoize.dart @@ -36,7 +36,7 @@ Func0 memo0(Func0 func) { Func1 memo1(Func1 func) { final argsToOutput = HashMap( equals: (a, b) => _listEquals(a, b), - hashCode: (list) => list[0].hashCode, + hashCode: (l) => l[0].hashCode, ); return ((A argA) { @@ -56,7 +56,7 @@ Func1 memo1(Func1 func) { Func2 memo2(Func2 func) { final argsToOutput = HashMap( equals: (a, b) => _listEquals(a, b), - hashCode: (list) => list[0].hashCode ^ list[1].hashCode + hashCode: (l) => l[0].hashCode ^ l[1].hashCode ); return ((A argA, B argB) { @@ -74,26 +74,19 @@ Func2 memo2(Func2 func) { /// Checks 3 arguments for equality with [==] operator and returns the cached /// result if they were not changed. Func3 memo3(Func3 func) { - late A prevArgA; - late B prevArgB; - late C prevArgC; - late R prevResult; - bool isInitial = true; + final argsToOutput = HashMap( + equals: (a, b) => _listEquals(a, b), + hashCode: (l) => l[0].hashCode ^ l[1].hashCode ^ l[2].hashCode + ); return ((A argA, B argB, C argC) { - if (!isInitial && - argA == prevArgA && - argB == prevArgB && - argC == prevArgC) { - return prevResult; + final cached = argsToOutput[[argA, argB, argC]]; + if (cached != null) { + return cached; } else { - prevArgA = argA; - prevArgB = argB; - prevArgC = argC; - prevResult = func(argA, argB, argC); - isInitial = false; - - return prevResult; + final res = func(argA, argB, argC); + argsToOutput[[argA, argB, argC]] = res; + return res; } }); } @@ -101,29 +94,19 @@ Func3 memo3(Func3 func) { /// Checks 4 arguments for equality with [==] operator and returns the cached /// result if they were not changed. Func4 memo4(Func4 func) { - late A prevArgA; - late B prevArgB; - late C prevArgC; - late D prevArgD; - late R prevResult; - bool isInitial = true; + final argsToOutput = HashMap( + equals: (a, b) => _listEquals(a, b), + hashCode: (l) => l[0].hashCode ^ l[1].hashCode ^ l[2].hashCode ^ l[3].hashCode + ); return ((A argA, B argB, C argC, D argD) { - if (!isInitial && - argA == prevArgA && - argB == prevArgB && - argC == prevArgC && - argD == prevArgD) { - return prevResult; + final cached = argsToOutput[[argA, argB, argC, argD]]; + if (cached != null) { + return cached; } else { - prevArgA = argA; - prevArgB = argB; - prevArgC = argC; - prevArgD = argD; - prevResult = func(argA, argB, argC, argD); - isInitial = false; - - return prevResult; + final res = func(argA, argB, argC, argD); + argsToOutput[[argA, argB, argC, argD]] = res; + return res; } }); } @@ -131,32 +114,19 @@ Func4 memo4(Func4 func) { /// Checks 5 arguments for equality with [==] operator and returns the cached /// result if it was not changed. Func5 memo5(Func5 func) { - late A prevArgA; - late B prevArgB; - late C prevArgC; - late D prevArgD; - late E prevArgE; - late R prevResult; - bool isInitial = true; + final argsToOutput = HashMap( + equals: (a, b) => _listEquals(a, b), + hashCode: (l) => l[0].hashCode ^ l[1].hashCode ^ l[2].hashCode ^ l[3].hashCode ^ l[4].hashCode + ); return ((A argA, B argB, C argC, D argD, E argE) { - if (!isInitial && - argA == prevArgA && - argB == prevArgB && - argC == prevArgC && - argD == prevArgD && - argE == prevArgE) { - return prevResult; + final cached = argsToOutput[[argA, argB, argC, argD, argE]]; + if (cached != null) { + return cached; } else { - prevArgA = argA; - prevArgB = argB; - prevArgC = argC; - prevArgD = argD; - prevArgE = argE; - prevResult = func(argA, argB, argC, argD, argE); - isInitial = false; - - return prevResult; + final res = func(argA, argB, argC, argD, argE); + argsToOutput[[argA, argB, argC, argD, argE]] = res; + return res; } }); } @@ -165,35 +135,19 @@ Func5 memo5(Func5 func) { /// result if it was not changed. Func6 memo6( Func6 func) { - late A prevArgA; - late B prevArgB; - late C prevArgC; - late D prevArgD; - late E prevArgE; - late F prevArgF; - late R prevResult; - bool isInitial = true; + final argsToOutput = HashMap( + equals: (a, b) => _listEquals(a, b), + hashCode: (l) => l[0].hashCode ^ l[1].hashCode ^ l[2].hashCode ^ l[3].hashCode ^ l[4].hashCode ^ l[5].hashCode + ); return ((A argA, B argB, C argC, D argD, E argE, F argF) { - if (!isInitial && - argA == prevArgA && - argB == prevArgB && - argC == prevArgC && - argD == prevArgD && - argE == prevArgE && - argF == prevArgF) { - return prevResult; + final cached = argsToOutput[[argA, argB, argC, argD, argE, argF]]; + if (cached != null) { + return cached; } else { - prevArgA = argA; - prevArgB = argB; - prevArgC = argC; - prevArgD = argD; - prevArgE = argE; - prevArgF = argF; - prevResult = func(argA, argB, argC, argD, argE, argF); - isInitial = false; - - return prevResult; + final res = func(argA, argB, argC, argD, argE, argF); + argsToOutput[[argA, argB, argC, argD, argE, argF]] = res; + return res; } }); } @@ -202,38 +156,19 @@ Func6 memo6( /// result if it was not changed. Func7 memo7( Func7 func) { - late A prevArgA; - late B prevArgB; - late C prevArgC; - late D prevArgD; - late E prevArgE; - late F prevArgF; - late G prevArgG; - late R prevResult; - bool isInitial = true; + final argsToOutput = HashMap( + equals: (a, b) => _listEquals(a, b), + hashCode: (l) => l[0].hashCode ^ l[1].hashCode ^ l[2].hashCode ^ l[3].hashCode ^ l[4].hashCode ^ l[5].hashCode ^ l[6].hashCode + ); return ((A argA, B argB, C argC, D argD, E argE, F argF, G argG) { - if (!isInitial && - argA == prevArgA && - argB == prevArgB && - argC == prevArgC && - argD == prevArgD && - argE == prevArgE && - argF == prevArgF && - argG == prevArgG) { - return prevResult; + final cached = argsToOutput[[argA, argB, argC, argD, argE, argF, argG]]; + if (cached != null) { + return cached; } else { - prevArgA = argA; - prevArgB = argB; - prevArgC = argC; - prevArgD = argD; - prevArgE = argE; - prevArgF = argF; - prevArgG = argG; - prevResult = func(argA, argB, argC, argD, argE, argF, argG); - isInitial = false; - - return prevResult; + final res = func(argA, argB, argC, argD, argE, argF, argG); + argsToOutput[[argA, argB, argC, argD, argE, argF, argG]] = res; + return res; } }); } @@ -242,41 +177,19 @@ Func7 memo7( /// result if it was not changed. Func8 memo8( Func8 func) { - late A prevArgA; - late B prevArgB; - late C prevArgC; - late D prevArgD; - late E prevArgE; - late F prevArgF; - late G prevArgG; - late H prevArgH; - late R prevResult; - bool isInitial = true; + final argsToOutput = HashMap( + equals: (a, b) => _listEquals(a, b), + hashCode: (l) => l[0].hashCode ^ l[1].hashCode ^ l[2].hashCode ^ l[3].hashCode ^ l[4].hashCode ^ l[5].hashCode ^ l[6].hashCode ^ l[7].hashCode + ); return ((A argA, B argB, C argC, D argD, E argE, F argF, G argG, H argH) { - if (!isInitial && - argA == prevArgA && - argB == prevArgB && - argC == prevArgC && - argD == prevArgD && - argE == prevArgE && - argF == prevArgF && - argG == prevArgG && - argH == prevArgH) { - return prevResult; + final cached = argsToOutput[[argA, argB, argC, argD, argE, argF, argG, argH]]; + if (cached != null) { + return cached; } else { - prevArgA = argA; - prevArgB = argB; - prevArgC = argC; - prevArgD = argD; - prevArgE = argE; - prevArgF = argF; - prevArgG = argG; - prevArgH = argH; - prevResult = func(argA, argB, argC, argD, argE, argF, argG, argH); - isInitial = false; - - return prevResult; + final res = func(argA, argB, argC, argD, argE, argF, argG, argH); + argsToOutput[[argA, argB, argC, argD, argE, argF, argG, argH]] = res; + return res; } }); } @@ -285,45 +198,19 @@ Func8 memo8( /// result if it was not changed. Func9 memo9( Func9 func) { - late A prevArgA; - late B prevArgB; - late C prevArgC; - late D prevArgD; - late E prevArgE; - late F prevArgF; - late G prevArgG; - late H prevArgH; - late I prevArgI; - late R prevResult; - bool isInitial = true; + final argsToOutput = HashMap( + equals: (a, b) => _listEquals(a, b), + hashCode: (l) => l[0].hashCode ^ l[1].hashCode ^ l[2].hashCode ^ l[3].hashCode ^ l[4].hashCode ^ l[5].hashCode ^ l[6].hashCode ^ l[7].hashCode ^ l[8].hashCode + ); - return ((A argA, B argB, C argC, D argD, E argE, F argF, G argG, H argH, - I argI) { - if (!isInitial && - argA == prevArgA && - argB == prevArgB && - argC == prevArgC && - argD == prevArgD && - argE == prevArgE && - argF == prevArgF && - argG == prevArgG && - argH == prevArgH && - argI == prevArgI) { - return prevResult; + return ((A argA, B argB, C argC, D argD, E argE, F argF, G argG, H argH, I argI) { + final cached = argsToOutput[[argA, argB, argC, argD, argE, argF, argG, argH, argI]]; + if (cached != null) { + return cached; } else { - prevArgA = argA; - prevArgB = argB; - prevArgC = argC; - prevArgD = argD; - prevArgE = argE; - prevArgF = argF; - prevArgG = argG; - prevArgH = argH; - prevArgI = argI; - prevResult = func(argA, argB, argC, argD, argE, argF, argG, argH, argI); - isInitial = false; - - return prevResult; + final res = func(argA, argB, argC, argD, argE, argF, argG, argH, argI); + argsToOutput[[argA, argB, argC, argD, argE, argF, argG, argH, argI]] = res; + return res; } }); } @@ -332,49 +219,19 @@ Func9 memo9( /// result if it was not changed. Func10 memo10( Func10 func) { - late A prevArgA; - late B prevArgB; - late C prevArgC; - late D prevArgD; - late E prevArgE; - late F prevArgF; - late G prevArgG; - late H prevArgH; - late I prevArgI; - late J prevArgJ; - late R prevResult; - bool isInitial = true; + final argsToOutput = HashMap( + equals: (a, b) => _listEquals(a, b), + hashCode: (l) => l[0].hashCode ^ l[1].hashCode ^ l[2].hashCode ^ l[3].hashCode ^ l[4].hashCode ^ l[5].hashCode ^ l[6].hashCode ^ l[7].hashCode ^ l[8].hashCode ^ l[9].hashCode + ); - return ((A argA, B argB, C argC, D argD, E argE, F argF, G argG, H argH, - I argI, J argJ) { - if (!isInitial && - argA == prevArgA && - argB == prevArgB && - argC == prevArgC && - argD == prevArgD && - argE == prevArgE && - argF == prevArgF && - argG == prevArgG && - argH == prevArgH && - argI == prevArgI && - argJ == prevArgJ) { - return prevResult; + return ((A argA, B argB, C argC, D argD, E argE, F argF, G argG, H argH, I argI, J argJ) { + final cached = argsToOutput[[argA, argB, argC, argD, argE, argF, argG, argH, argI, argJ]]; + if (cached != null) { + return cached; } else { - prevArgA = argA; - prevArgB = argB; - prevArgC = argC; - prevArgD = argD; - prevArgE = argE; - prevArgF = argF; - prevArgG = argG; - prevArgH = argH; - prevArgI = argI; - prevArgJ = argJ; - prevResult = - func(argA, argB, argC, argD, argE, argF, argG, argH, argI, argJ); - isInitial = false; - - return prevResult; + final res = func(argA, argB, argC, argD, argE, argF, argG, argH, argI, argJ); + argsToOutput[[argA, argB, argC, argD, argE, argF, argG, argH, argI, argJ]] = res; + return res; } }); } From c961c3c21b3089feb2251028c82c661069f5b446 Mon Sep 17 00:00:00 2001 From: TheLastGimbus Date: Sun, 22 Aug 2021 21:02:47 +0200 Subject: [PATCH 08/10] Make hashCode more compact --- lib/memoize.dart | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/lib/memoize.dart b/lib/memoize.dart index abd18ea..fa77a7b 100644 --- a/lib/memoize.dart +++ b/lib/memoize.dart @@ -14,6 +14,12 @@ bool _listEquals(List? a, List? b) { return true; } +int _listHashCode(List list) { + var hashCode = 0; + for (final el in list) hashCode = hashCode ^ el.hashCode; + return hashCode; +} + /// Lazy evaluates function and returns cached result on each call. Func0 memo0(Func0 func) { late R prevResult; @@ -36,7 +42,7 @@ Func0 memo0(Func0 func) { Func1 memo1(Func1 func) { final argsToOutput = HashMap( equals: (a, b) => _listEquals(a, b), - hashCode: (l) => l[0].hashCode, + hashCode: (l) => _listHashCode(l), ); return ((A argA) { @@ -56,7 +62,7 @@ Func1 memo1(Func1 func) { Func2 memo2(Func2 func) { final argsToOutput = HashMap( equals: (a, b) => _listEquals(a, b), - hashCode: (l) => l[0].hashCode ^ l[1].hashCode + hashCode: (l) => _listHashCode(l), ); return ((A argA, B argB) { @@ -76,7 +82,7 @@ Func2 memo2(Func2 func) { Func3 memo3(Func3 func) { final argsToOutput = HashMap( equals: (a, b) => _listEquals(a, b), - hashCode: (l) => l[0].hashCode ^ l[1].hashCode ^ l[2].hashCode + hashCode: (l) => _listHashCode(l), ); return ((A argA, B argB, C argC) { @@ -96,7 +102,7 @@ Func3 memo3(Func3 func) { Func4 memo4(Func4 func) { final argsToOutput = HashMap( equals: (a, b) => _listEquals(a, b), - hashCode: (l) => l[0].hashCode ^ l[1].hashCode ^ l[2].hashCode ^ l[3].hashCode + hashCode: (l) => _listHashCode(l), ); return ((A argA, B argB, C argC, D argD) { @@ -116,7 +122,7 @@ Func4 memo4(Func4 func) { Func5 memo5(Func5 func) { final argsToOutput = HashMap( equals: (a, b) => _listEquals(a, b), - hashCode: (l) => l[0].hashCode ^ l[1].hashCode ^ l[2].hashCode ^ l[3].hashCode ^ l[4].hashCode + hashCode: (l) => _listHashCode(l), ); return ((A argA, B argB, C argC, D argD, E argE) { @@ -137,7 +143,7 @@ Func6 memo6( Func6 func) { final argsToOutput = HashMap( equals: (a, b) => _listEquals(a, b), - hashCode: (l) => l[0].hashCode ^ l[1].hashCode ^ l[2].hashCode ^ l[3].hashCode ^ l[4].hashCode ^ l[5].hashCode + hashCode: (l) => _listHashCode(l), ); return ((A argA, B argB, C argC, D argD, E argE, F argF) { @@ -158,7 +164,7 @@ Func7 memo7( Func7 func) { final argsToOutput = HashMap( equals: (a, b) => _listEquals(a, b), - hashCode: (l) => l[0].hashCode ^ l[1].hashCode ^ l[2].hashCode ^ l[3].hashCode ^ l[4].hashCode ^ l[5].hashCode ^ l[6].hashCode + hashCode: (l) => _listHashCode(l), ); return ((A argA, B argB, C argC, D argD, E argE, F argF, G argG) { @@ -179,7 +185,7 @@ Func8 memo8( Func8 func) { final argsToOutput = HashMap( equals: (a, b) => _listEquals(a, b), - hashCode: (l) => l[0].hashCode ^ l[1].hashCode ^ l[2].hashCode ^ l[3].hashCode ^ l[4].hashCode ^ l[5].hashCode ^ l[6].hashCode ^ l[7].hashCode + hashCode: (l) => _listHashCode(l), ); return ((A argA, B argB, C argC, D argD, E argE, F argF, G argG, H argH) { @@ -200,7 +206,7 @@ Func9 memo9( Func9 func) { final argsToOutput = HashMap( equals: (a, b) => _listEquals(a, b), - hashCode: (l) => l[0].hashCode ^ l[1].hashCode ^ l[2].hashCode ^ l[3].hashCode ^ l[4].hashCode ^ l[5].hashCode ^ l[6].hashCode ^ l[7].hashCode ^ l[8].hashCode + hashCode: (l) => _listHashCode(l), ); return ((A argA, B argB, C argC, D argD, E argE, F argF, G argG, H argH, I argI) { @@ -221,7 +227,7 @@ Func10 memo10( Func10 func) { final argsToOutput = HashMap( equals: (a, b) => _listEquals(a, b), - hashCode: (l) => l[0].hashCode ^ l[1].hashCode ^ l[2].hashCode ^ l[3].hashCode ^ l[4].hashCode ^ l[5].hashCode ^ l[6].hashCode ^ l[7].hashCode ^ l[8].hashCode ^ l[9].hashCode + hashCode: (l) => _listHashCode(l), ); return ((A argA, B argB, C argC, D argD, E argE, F argF, G argG, H argH, I argI, J argJ) { From eb4571c6721a248166edcc1b901a685b279688be Mon Sep 17 00:00:00 2001 From: TheLastGimbus Date: Sun, 22 Aug 2021 21:06:50 +0200 Subject: [PATCH 09/10] Shorter arg names to fit when auto-formatting --- lib/memoize.dart | 80 ++++++++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/lib/memoize.dart b/lib/memoize.dart index fa77a7b..c31c3b7 100644 --- a/lib/memoize.dart +++ b/lib/memoize.dart @@ -45,13 +45,13 @@ Func1 memo1(Func1 func) { hashCode: (l) => _listHashCode(l), ); - return ((A argA) { - final cached = argsToOutput[[argA]]; + return ((A aA) { + final cached = argsToOutput[[aA]]; if (cached != null) { return cached; } else { - final res = func(argA); - argsToOutput[[argA]] = res; + final res = func(aA); + argsToOutput[[aA]] = res; return res; } }); @@ -65,13 +65,13 @@ Func2 memo2(Func2 func) { hashCode: (l) => _listHashCode(l), ); - return ((A argA, B argB) { - final cached = argsToOutput[[argA, argB]]; + return ((A aA, B aB) { + final cached = argsToOutput[[aA, aB]]; if (cached != null) { return cached; } else { - final res = func(argA, argB); - argsToOutput[[argA, argB]] = res; + final res = func(aA, aB); + argsToOutput[[aA, aB]] = res; return res; } }); @@ -85,13 +85,13 @@ Func3 memo3(Func3 func) { hashCode: (l) => _listHashCode(l), ); - return ((A argA, B argB, C argC) { - final cached = argsToOutput[[argA, argB, argC]]; + return ((A aA, B aB, C aC) { + final cached = argsToOutput[[aA, aB, aC]]; if (cached != null) { return cached; } else { - final res = func(argA, argB, argC); - argsToOutput[[argA, argB, argC]] = res; + final res = func(aA, aB, aC); + argsToOutput[[aA, aB, aC]] = res; return res; } }); @@ -105,13 +105,13 @@ Func4 memo4(Func4 func) { hashCode: (l) => _listHashCode(l), ); - return ((A argA, B argB, C argC, D argD) { - final cached = argsToOutput[[argA, argB, argC, argD]]; + return ((A aA, B aB, C aC, D aD) { + final cached = argsToOutput[[aA, aB, aC, aD]]; if (cached != null) { return cached; } else { - final res = func(argA, argB, argC, argD); - argsToOutput[[argA, argB, argC, argD]] = res; + final res = func(aA, aB, aC, aD); + argsToOutput[[aA, aB, aC, aD]] = res; return res; } }); @@ -125,13 +125,13 @@ Func5 memo5(Func5 func) { hashCode: (l) => _listHashCode(l), ); - return ((A argA, B argB, C argC, D argD, E argE) { - final cached = argsToOutput[[argA, argB, argC, argD, argE]]; + return ((A aA, B aB, C aC, D aD, E aE) { + final cached = argsToOutput[[aA, aB, aC, aD, aE]]; if (cached != null) { return cached; } else { - final res = func(argA, argB, argC, argD, argE); - argsToOutput[[argA, argB, argC, argD, argE]] = res; + final res = func(aA, aB, aC, aD, aE); + argsToOutput[[aA, aB, aC, aD, aE]] = res; return res; } }); @@ -146,13 +146,13 @@ Func6 memo6( hashCode: (l) => _listHashCode(l), ); - return ((A argA, B argB, C argC, D argD, E argE, F argF) { - final cached = argsToOutput[[argA, argB, argC, argD, argE, argF]]; + return ((A aA, B aB, C aC, D aD, E aE, F aF) { + final cached = argsToOutput[[aA, aB, aC, aD, aE, aF]]; if (cached != null) { return cached; } else { - final res = func(argA, argB, argC, argD, argE, argF); - argsToOutput[[argA, argB, argC, argD, argE, argF]] = res; + final res = func(aA, aB, aC, aD, aE, aF); + argsToOutput[[aA, aB, aC, aD, aE, aF]] = res; return res; } }); @@ -167,13 +167,13 @@ Func7 memo7( hashCode: (l) => _listHashCode(l), ); - return ((A argA, B argB, C argC, D argD, E argE, F argF, G argG) { - final cached = argsToOutput[[argA, argB, argC, argD, argE, argF, argG]]; + return ((A aA, B aB, C aC, D aD, E aE, F aF, G aG) { + final cached = argsToOutput[[aA, aB, aC, aD, aE, aF, aG]]; if (cached != null) { return cached; } else { - final res = func(argA, argB, argC, argD, argE, argF, argG); - argsToOutput[[argA, argB, argC, argD, argE, argF, argG]] = res; + final res = func(aA, aB, aC, aD, aE, aF, aG); + argsToOutput[[aA, aB, aC, aD, aE, aF, aG]] = res; return res; } }); @@ -188,13 +188,13 @@ Func8 memo8( hashCode: (l) => _listHashCode(l), ); - return ((A argA, B argB, C argC, D argD, E argE, F argF, G argG, H argH) { - final cached = argsToOutput[[argA, argB, argC, argD, argE, argF, argG, argH]]; + return ((A aA, B aB, C aC, D aD, E aE, F aF, G aG, H aH) { + final cached = argsToOutput[[aA, aB, aC, aD, aE, aF, aG, aH]]; if (cached != null) { return cached; } else { - final res = func(argA, argB, argC, argD, argE, argF, argG, argH); - argsToOutput[[argA, argB, argC, argD, argE, argF, argG, argH]] = res; + final res = func(aA, aB, aC, aD, aE, aF, aG, aH); + argsToOutput[[aA, aB, aC, aD, aE, aF, aG, aH]] = res; return res; } }); @@ -209,13 +209,13 @@ Func9 memo9( hashCode: (l) => _listHashCode(l), ); - return ((A argA, B argB, C argC, D argD, E argE, F argF, G argG, H argH, I argI) { - final cached = argsToOutput[[argA, argB, argC, argD, argE, argF, argG, argH, argI]]; + return ((A aA, B aB, C aC, D aD, E aE, F aF, G aG, H aH, I aI) { + final cached = argsToOutput[[aA, aB, aC, aD, aE, aF, aG, aH, aI]]; if (cached != null) { return cached; } else { - final res = func(argA, argB, argC, argD, argE, argF, argG, argH, argI); - argsToOutput[[argA, argB, argC, argD, argE, argF, argG, argH, argI]] = res; + final res = func(aA, aB, aC, aD, aE, aF, aG, aH, aI); + argsToOutput[[aA, aB, aC, aD, aE, aF, aG, aH, aI]] = res; return res; } }); @@ -230,13 +230,13 @@ Func10 memo10( hashCode: (l) => _listHashCode(l), ); - return ((A argA, B argB, C argC, D argD, E argE, F argF, G argG, H argH, I argI, J argJ) { - final cached = argsToOutput[[argA, argB, argC, argD, argE, argF, argG, argH, argI, argJ]]; + return ((A aA, B aB, C aC, D aD, E aE, F aF, G aG, H aH, I aI, J aJ) { + final cached = argsToOutput[[aA, aB, aC, aD, aE, aF, aG, aH, aI, aJ]]; if (cached != null) { return cached; } else { - final res = func(argA, argB, argC, argD, argE, argF, argG, argH, argI, argJ); - argsToOutput[[argA, argB, argC, argD, argE, argF, argG, argH, argI, argJ]] = res; + final res = func(aA, aB, aC, aD, aE, aF, aG, aH, aI, aJ); + argsToOutput[[aA, aB, aC, aD, aE, aF, aG, aH, aI, aJ]] = res; return res; } }); From 84c285410e0e96ca779c2cea0bac65082734ba17 Mon Sep 17 00:00:00 2001 From: TheLastGimbus Date: Sun, 22 Aug 2021 21:07:38 +0200 Subject: [PATCH 10/10] Fix tests... I hope :grimacing: --- test/memoize_test.dart | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/memoize_test.dart b/test/memoize_test.dart index 1aa6a8a..5ded087 100644 --- a/test/memoize_test.dart +++ b/test/memoize_test.dart @@ -663,8 +663,8 @@ void main() { expect(func(rect1, rect2, rect3, rect4, rect5, rect6, rect7), 1); expect(func(rect1, rect2, rect3, rect4, rect4, rect6, rect8), 2); expect(func(rect1, rect2, rect3, rect4, rect4, rect4, rect8), 2); - expect(func(rect2, rect2, rect3, rect3, rect6, rect1, rect7), 3); - expect(func(rect2, rect2, rect3, rect3, rect6, rect1, rect4), 3); + expect(func(rect2, rect2, rect3, rect3, rect6, rect1, rect7), 1); + expect(func(rect2, rect2, rect3, rect3, rect6, rect1, rect4), 1); }); }); @@ -798,8 +798,8 @@ void main() { expect(func(rect1, rect1, rect3, rect4, rect5, rect1, rect7, rect8), 1); expect(func(rect1, rect2, rect2, rect4, rect4, rect6, rect8, rect9), 2); expect(func(rect1, rect2, rect3, rect1, rect4, rect4, rect4, rect9), 2); - expect(func(rect2, rect2, rect3, rect3, rect6, rect1, rect7, rect1), 3); - expect(func(rect2, rect2, rect3, rect3, rect6, rect1, rect4, rect1), 3); + expect(func(rect2, rect2, rect3, rect3, rect6, rect1, rect7, rect1), 1); + expect(func(rect2, rect2, rect3, rect3, rect6, rect1, rect4, rect1), 1); }); }); @@ -940,8 +940,8 @@ void main() { expect(func(rect1, rect1, rect3, rect4, rect5, rect1, rect7, rect8, rect9), 1); expect(func(rect1, rect2, rect2, rect4, rect4, rect6, rect8, rect9, rect10), 2); expect(func(rect1, rect2, rect3, rect1, rect4, rect4, rect4, rect9, rect10), 2); - expect(func(rect2, rect2, rect3, rect3, rect6, rect1, rect7, rect1, rect1), 3); - expect(func(rect2, rect2, rect3, rect3, rect6, rect1, rect4, rect1, rect2), 3); + expect(func(rect2, rect2, rect3, rect3, rect6, rect1, rect7, rect1, rect1), 1); + expect(func(rect2, rect2, rect3, rect3, rect6, rect1, rect4, rect1, rect2), 1); }); }); @@ -1091,8 +1091,8 @@ void main() { expect(func(rect1, rect1, rect3, rect4, rect5, rect1, rect7, rect8, rect9, rect10), 1); expect(func(rect1, rect2, rect2, rect4, rect4, rect6, rect8, rect9, rect10, rect11), 2); expect(func(rect1, rect2, rect3, rect1, rect4, rect4, rect4, rect9, rect10, rect11), 2); - expect(func(rect2, rect2, rect3, rect3, rect6, rect1, rect7, rect1, rect1, rect10), 3); - expect(func(rect2, rect2, rect3, rect3, rect6, rect1, rect4, rect1, rect2, rect10), 3); + expect(func(rect2, rect2, rect3, rect3, rect6, rect1, rect7, rect1, rect1, rect10), 1); + expect(func(rect2, rect2, rect3, rect3, rect6, rect1, rect4, rect1, rect2, rect10), 1); }); });