fsMemoize
This commit is contained in:
@@ -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"),
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user