diff --git a/kiss/src/kiss/Kiss.hx b/kiss/src/kiss/Kiss.hx index adec5ad5..78143fa7 100644 --- a/kiss/src/kiss/Kiss.hx +++ b/kiss/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/kiss/src/kiss/Prelude.hx b/kiss/src/kiss/Prelude.hx index f912046a..336275bc 100644 --- a/kiss/src/kiss/Prelude.hx +++ b/kiss/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);