pairs, memoize

This commit is contained in:
2020-12-11 19:55:45 -07:00
parent e07fdc1665
commit c7c2fb4709
2 changed files with 31 additions and 1 deletions

View File

@@ -46,6 +46,8 @@ class Kiss {
k.defAlias("print", Symbol("Prelude.print"));
k.defAlias("groups", Symbol("Prelude.groups"));
k.defAlias("zip", Symbol("Prelude.zip"));
k.defAlias("pairs", Symbol("Prelude.pairs")); // TODO test pairs
k.defAlias("memoize", Symbol("Prelude.memoize")); // TODO test memoize
k.defAlias("map", Symbol("Lambda.map"));
k.defAlias("filter", Symbol("Lambda.filter")); // TODO use truthy as the default filter function
k.defAlias("has", Symbol("Lambda.has"));

View File

@@ -4,6 +4,7 @@ using Std;
import kiss.Operand;
import haxe.ds.Either;
import haxe.Constraints;
/** What functions that process Lists should do when there are more elements than expected **/
enum ExtraElementHandling {
@@ -158,7 +159,7 @@ class Prelude {
return fullGroups;
}
public static function zip<A, B>(a:Array<A>, b:Array<B>, extraHandling = Drop):Array<Array<Dynamic>> {
public static function zip(a:Array<Dynamic>, b:Array<Dynamic>, extraHandling = Drop):kiss.List<kiss.List<Dynamic>> {
var max = Math.floor(if (a.length != b.length) {
switch (extraHandling) {
case Throw:
@@ -186,6 +187,16 @@ class Prelude {
];
}
public static function pairs(l:kiss.List<Dynamic>, loopAround = false):kiss.List<kiss.List<Dynamic>> {
var l1 = l.slice(0, l.length - 1);
var l2 = l.slice(1, l.length);
if (loopAround) {
l1.push(l[-1]);
l2.unshift(l[0]);
}
return zip(l1, l2);
}
// Ranges with a min, exclusive max, and step size, just like Python.
public static function range(min, max, step):Iterator<Int> {
if (step <= 0)
@@ -224,6 +235,23 @@ class Prelude {
}
}
// Based on: http://old.haxe.org/doc/snip/memoize
public static function memoize(func:Function, ?caller:Dynamic):Function {
var argMap = new Map<String, Dynamic>();
var f = (args:Array<Dynamic>) -> {
var argString = args.join('|');
return if (argMap.exists(argString)) {
argMap[argString];
} else {
var ret = Reflect.callMethod(caller, func, args);
argMap[argString] = ret;
ret;
};
};
f = Reflect.makeVarArgs(f);
return f;
}
public static function print<T>(v:T) {
#if (sys || hxnodejs)
Sys.println(v);