From 1a7a0fc8ea966d474d8d976a3bfc2195db90e3bf Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Tue, 2 Nov 2021 22:04:07 -0400 Subject: [PATCH] fsMemoize --- src/kiss/Kiss.hx | 1 + src/kiss/Prelude.hx | 27 +++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/kiss/Kiss.hx b/src/kiss/Kiss.hx index adec5ad..78143fa 100644 --- a/src/kiss/Kiss.hx +++ b/src/kiss/Kiss.hx @@ -66,6 +66,7 @@ class Kiss { "pairs" => Symbol("Prelude.pairs"), // TODO test pairs "reversed" => Symbol("Prelude.reversed"), // TODO test reversed "memoize" => Symbol("Prelude.memoize"), // TODO test memoize + "fsMemoize" => Symbol("Prelude.fsMemoize"), // TODO test fsMemoize "symbolName" => Symbol("Prelude.symbolName"), "symbolNameValue" => Symbol("Prelude.symbolNameValue"), "symbol" => Symbol("Prelude.symbol"), diff --git a/src/kiss/Prelude.hx b/src/kiss/Prelude.hx index f912046..336275b 100644 --- a/src/kiss/Prelude.hx +++ b/src/kiss/Prelude.hx @@ -5,6 +5,7 @@ using Std; import kiss.ReaderExp; import haxe.ds.Either; import haxe.Constraints; +import haxe.DynamicAccess; #if (!macro && hxnodejs) import js.node.ChildProcess; import js.node.Buffer; @@ -21,6 +22,7 @@ import python.Bytearray; #end import uuid.Uuid; import haxe.io.Path; +import haxe.Json; using StringTools; using uuid.Uuid; @@ -320,8 +322,12 @@ class Prelude { } // Based on: http://old.haxe.org/doc/snip/memoize - public static function memoize(func:Function, ?caller:Dynamic):Function { - var argMap = new Map(); + public static function memoize(func:Function, ?caller:Dynamic, ?jsonFile:String, ?jsonArgMap:Map):Function { + var argMap = if (jsonArgMap != null) { + jsonArgMap; + } else { + new Map(); + } var f = (args:Array) -> { var argString = args.join('|'); return if (argMap.exists(argString)) { @@ -329,6 +335,11 @@ class Prelude { } else { var ret = Reflect.callMethod(caller, func, args); argMap[argString] = ret; + #if (sys || hxnodejs) + if (jsonFile != null) { + File.saveContent(jsonFile, Json.stringify(argMap)); + } + #end ret; }; }; @@ -336,6 +347,18 @@ class Prelude { return f; } + #if (sys || hxnodejs) + public static function fsMemoize(func:Function, funcName:String, ?caller:Dynamic):Function { + var fileName = '${funcName}.memoized'; + if (!FileSystem.exists(fileName)) + File.saveContent(fileName, "{}"); + + var pastResults:DynamicAccess = Json.parse(File.getContent(fileName)); + var argMap:Map = [for (key => value in pastResults) key => value]; + return memoize(func, caller, fileName, argMap); + } + #end + public static function _printStr(s:String) { #if (sys || hxnodejs) Sys.println(s);