fsMemoize

This commit is contained in:
2021-11-02 22:04:07 -04:00
parent c8498e86fe
commit 1a7a0fc8ea
2 changed files with 26 additions and 2 deletions

View File

@@ -66,6 +66,7 @@ class Kiss {
"pairs" => Symbol("Prelude.pairs"), // TODO test pairs "pairs" => Symbol("Prelude.pairs"), // TODO test pairs
"reversed" => Symbol("Prelude.reversed"), // TODO test reversed "reversed" => Symbol("Prelude.reversed"), // TODO test reversed
"memoize" => Symbol("Prelude.memoize"), // TODO test memoize "memoize" => Symbol("Prelude.memoize"), // TODO test memoize
"fsMemoize" => Symbol("Prelude.fsMemoize"), // TODO test fsMemoize
"symbolName" => Symbol("Prelude.symbolName"), "symbolName" => Symbol("Prelude.symbolName"),
"symbolNameValue" => Symbol("Prelude.symbolNameValue"), "symbolNameValue" => Symbol("Prelude.symbolNameValue"),
"symbol" => Symbol("Prelude.symbol"), "symbol" => Symbol("Prelude.symbol"),

View File

@@ -5,6 +5,7 @@ using Std;
import kiss.ReaderExp; import kiss.ReaderExp;
import haxe.ds.Either; import haxe.ds.Either;
import haxe.Constraints; import haxe.Constraints;
import haxe.DynamicAccess;
#if (!macro && hxnodejs) #if (!macro && hxnodejs)
import js.node.ChildProcess; import js.node.ChildProcess;
import js.node.Buffer; import js.node.Buffer;
@@ -21,6 +22,7 @@ import python.Bytearray;
#end #end
import uuid.Uuid; import uuid.Uuid;
import haxe.io.Path; import haxe.io.Path;
import haxe.Json;
using StringTools; using StringTools;
using uuid.Uuid; using uuid.Uuid;
@@ -320,8 +322,12 @@ class Prelude {
} }
// Based on: http://old.haxe.org/doc/snip/memoize // Based on: http://old.haxe.org/doc/snip/memoize
public static function memoize(func:Function, ?caller:Dynamic):Function { public static function memoize(func:Function, ?caller:Dynamic, ?jsonFile:String, ?jsonArgMap:Map<String, Dynamic>):Function {
var argMap = new Map<String, Dynamic>(); var argMap = if (jsonArgMap != null) {
jsonArgMap;
} else {
new Map<String, Dynamic>();
}
var f = (args:Array<Dynamic>) -> { var f = (args:Array<Dynamic>) -> {
var argString = args.join('|'); var argString = args.join('|');
return if (argMap.exists(argString)) { return if (argMap.exists(argString)) {
@@ -329,6 +335,11 @@ class Prelude {
} else { } else {
var ret = Reflect.callMethod(caller, func, args); var ret = Reflect.callMethod(caller, func, args);
argMap[argString] = ret; argMap[argString] = ret;
#if (sys || hxnodejs)
if (jsonFile != null) {
File.saveContent(jsonFile, Json.stringify(argMap));
}
#end
ret; ret;
}; };
}; };
@@ -336,6 +347,18 @@ class Prelude {
return f; 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<Dynamic> = Json.parse(File.getContent(fileName));
var argMap:Map<String, Dynamic> = [for (key => value in pastResults) key => value];
return memoize(func, caller, fileName, argMap);
}
#end
public static function _printStr(s:String) { public static function _printStr(s:String) {
#if (sys || hxnodejs) #if (sys || hxnodejs)
Sys.println(s); Sys.println(s);