From 809a39ffe11a45fc74951ad4e79eaacb63731f1c Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Sat, 5 Dec 2020 19:06:15 -0700 Subject: [PATCH] (zip [l1] [l2]) --- src/kiss/Kiss.hx | 2 +- src/kiss/Prelude.hx | 28 ++++++++++++++++++++++++++++ src/test/cases/BasicTestCase.hx | 7 +++++-- src/test/cases/BasicTestCase.kiss | 17 +++++++++++++---- 4 files changed, 47 insertions(+), 7 deletions(-) diff --git a/src/kiss/Kiss.hx b/src/kiss/Kiss.hx index bd3c521..af712a1 100644 --- a/src/kiss/Kiss.hx +++ b/src/kiss/Kiss.hx @@ -50,7 +50,7 @@ class Kiss { // Helpful aliases k.defAlias("print", Symbol("Prelude.print")); k.defAlias("groups", Symbol("Prelude.groups")); - + k.defAlias("zip", Symbol("Prelude.zip")); 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")); diff --git a/src/kiss/Prelude.hx b/src/kiss/Prelude.hx index 79c6c8b..9976a16 100644 --- a/src/kiss/Prelude.hx +++ b/src/kiss/Prelude.hx @@ -158,6 +158,34 @@ class Prelude { return fullGroups; } + public static function zip(a:Array, b:Array, extraHandling = Drop):Array> { + var max = Math.floor(if (a.length != b.length) { + switch (extraHandling) { + case Throw: + throw 'zip was given lists of mis-matched size: $a, $b'; + case Keep: + Math.max(a.length, b.length); + case Drop: + Math.min(a.length, b.length); + } + } else { + a.length; + }); + + return [ + for (idx in 0...max) [ + if (idx < a.length) + a[idx] + else + null, + if (idx < b.length) + b[idx] + else + null + ] + ]; + } + public static dynamic function truthy(v:Any) { return switch (Type.typeof(v)) { case TNull: false; diff --git a/src/test/cases/BasicTestCase.hx b/src/test/cases/BasicTestCase.hx index 0e3d8f2..d76682b 100644 --- a/src/test/cases/BasicTestCase.hx +++ b/src/test/cases/BasicTestCase.hx @@ -136,8 +136,11 @@ class BasicTestCase extends Test { } function testGroups() { - Assert.equals([[1, 2], [3, 4]].toString(), BasicTestCase.myGroups1().toString()); - Assert.equals([[1, 2, 3], [4]].toString(), BasicTestCase.myGroups2().toString()); + _testGroups(); + } + + function testZip() { + _testZip(); } function testLet() { diff --git a/src/test/cases/BasicTestCase.kiss b/src/test/cases/BasicTestCase.kiss index 4326d72..4683090 100644 --- a/src/test/cases/BasicTestCase.kiss +++ b/src/test/cases/BasicTestCase.kiss @@ -114,11 +114,20 @@ (defun myTypeCheck [] (the Int 5)) -(defun myGroups1 [] - (groups [1 2 3 4] 2)) +(defun _testGroups [] + (Assert.equals (.toString [[1 2] [3 4]]) (.toString (groups [1 2 3 4] 2))) + (Assert.equals (.toString [[1 2 3] [4]]) (.toString (groups [1 2 3 4] 3 Keep))) + (try (begin (groups [1 2 3 4] 3 Throw) (Assert.fail)) + (catch [error] (Assert.pass)))) -(defun myGroups2 [] - (groups [1 2 3 4] 3 Keep)) +(defun _testZip [] + (Assert.equals (.toString [[1 2] [3 4]]) (.toString (zip [1 3] [2 4] Throw))) + (Assert.equals (.toString [[1 2] [3 null]]) (.toString (zip [1 3] [2] Keep))) + (Assert.equals (.toString [[1 2] [null 4]]) (.toString (zip [1 null] [2 4] Keep))) + (try (begin (zip [1 3] [2] Throw) (Assert.fail)) + (catch [error] (Assert.pass))) + (try (begin (zip [1] [2 4] Throw) (Assert.fail)) + (catch [error] (Assert.pass)))) (defun _testLet [] (let [a 5