From c52e74c2351c3f5f430cc54ea3dc642702b253e7 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Mon, 23 May 2022 00:29:01 +0000 Subject: [PATCH] whileLet --- src/kiss/Macros.hx | 12 ++++++++++++ src/test/cases/BasicTestCase.hx | 5 +++++ src/test/cases/BasicTestCase.kiss | 10 +++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/kiss/Macros.hx b/src/kiss/Macros.hx index 63b0366..e8a38b2 100644 --- a/src/kiss/Macros.hx +++ b/src/kiss/Macros.hx @@ -747,6 +747,18 @@ class Macros { } macros["awaitLet"] = awaitLet; + + macros["whileLet"] = (wholeExp:ReaderExp, exps:Array, k:KissState) -> { + wholeExp.checkNumArgs(2, null, "(whileLet [] )"); + var b = wholeExp.expBuilder(); + return b.callSymbol("loop", [ + b.callSymbol("ifLet", [ + exps[0], + b.begin(exps.slice(1)), + b.callSymbol("break", []) + ]) + ]); + }; // TODO test defNew macros["defnew"] = (wholeExp:ReaderExp, exps:Array, k:KissState) -> { diff --git a/src/test/cases/BasicTestCase.hx b/src/test/cases/BasicTestCase.hx index f267b76..abd2ad3 100644 --- a/src/test/cases/BasicTestCase.hx +++ b/src/test/cases/BasicTestCase.hx @@ -4,6 +4,7 @@ import utest.Test; import utest.Assert; import kiss.Prelude; import kiss.List; +import kiss.Stream; import haxe.ds.Option; using StringTools; @@ -341,6 +342,10 @@ class BasicTestCase extends Test { function testIntersect() { _testIntersect(); } + + function testWhileLet() { + _testWhileLet(); + } } class BasicObject { diff --git a/src/test/cases/BasicTestCase.kiss b/src/test/cases/BasicTestCase.kiss index 455d7a2..cbfb3d4 100644 --- a/src/test/cases/BasicTestCase.kiss +++ b/src/test/cases/BasicTestCase.kiss @@ -628,4 +628,12 @@ (assert (contains intersection3d "cy1")) (assert (contains intersection3d "cy3")) ) - (Assert.pass)) \ No newline at end of file + (Assert.pass)) + +(function _testWhileLet [] + (let [&mut idx 0 + lines ["a" "b" "c"] + stream (Stream.fromString "a\nb\nc")] + (whileLet [(Some line) (stream.takeLine)] + (Assert.equals (nth lines idx) line) + (+= idx 1)))) \ No newline at end of file