diff --git a/eo-runtime/src/main/eo/org/eolang/seq.eo b/eo-runtime/src/main/eo/org/eolang/seq.eo index b1f66aea66..ef6a2d2220 100644 --- a/eo-runtime/src/main/eo/org/eolang/seq.eo +++ b/eo-runtime/src/main/eo/org/eolang/seq.eo @@ -28,4 +28,21 @@ # The object, when being dataized, dataizes all provided # "steps" (except the last one) and returns the last one. -[steps] > seq /? +[steps] > seq + if. > @ + steps.length.eq 0 + true + loop 0 + steps.length.minus 1 > max-len! + + [index] > loop + if. > @ + and. + index.lt ^.max-len + or. + (dataized (steps.at index)).as-bool + true + ^.loop + index.plus 1 + steps.at index + diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOseq.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOseq.java deleted file mode 100644 index 5f9f763007..0000000000 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOseq.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2016-2024 Objectionary.com - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* - * @checkstyle PackageNameCheck (4 lines) - */ -package EOorg.EOeolang; - -import org.eolang.AtVoid; -import org.eolang.Atom; -import org.eolang.Data; -import org.eolang.Dataized; -import org.eolang.PhDefault; -import org.eolang.PhMethod; -import org.eolang.Phi; -import org.eolang.Versionized; -import org.eolang.XmirObject; - -/** - * SEQ. - * @since 1.0 - * @checkstyle TypeNameCheck (5 lines) - */ -@Versionized -@XmirObject(oname = "seq") -public final class EOseq extends PhDefault implements Atom { - - /** - * Ctor. - */ - public EOseq() { - this.add("steps", new AtVoid("steps")); - } - - @Override - public Phi lambda() { - final Phi steps = this.take("steps"); - final Phi[] items = EOseq.eoTupleAsArray(steps); - for (int ind = 0; ind < items.length - 1; ++ind) { - new Dataized(items[ind]).take(); - } - final Phi ret; - if (items.length > 0) { - ret = new PhMethod(steps, "tail"); - } else { - ret = new Data.ToPhi(false); - } - return ret; - } - - /** - * Converts eo tuple to java array. - * @param args Eo tuple. - * @return Java array. - */ - private static Phi[] eoTupleAsArray(final Phi args) { - final int length = Math.toIntExact( - new Dataized( - args.take("length") - ).take(Long.class) - ); - final Phi[] res = new Phi[length]; - Phi external = args; - for (int ind = length - 1; ind >= 0; --ind) { - res[ind] = new PhMethod(external, "tail"); - external = external.take("head"); - } - return res; - } -} diff --git a/eo-runtime/src/test/eo/org/eolang/seq-tests.eo b/eo-runtime/src/test/eo/org/eolang/seq-tests.eo index 9b154587d5..5bf65700e7 100644 --- a/eo-runtime/src/test/eo/org/eolang/seq-tests.eo +++ b/eo-runtime/src/test/eo/org/eolang/seq-tests.eo @@ -174,3 +174,21 @@ m.put (m.as-int.plus 1) m 1 + +# Test. +[] > seq-calculates-and-returns + eq. > @ + 1 + seq + * + 0 + 1 + +# Test. +[] > seq-calculates-and-returns-object + eq. > @ + "Hello!" + seq + * + 0 + "Hello!" diff --git a/eo-runtime/src/test/java/EOorg/EOeolang/EOseqTest.java b/eo-runtime/src/test/java/EOorg/EOeolang/EOseqTest.java deleted file mode 100644 index ed0958aafd..0000000000 --- a/eo-runtime/src/test/java/EOorg/EOeolang/EOseqTest.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2016-2024 Objectionary.com - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* - * @checkstyle PackageNameCheck (10 lines) - */ -package EOorg.EOeolang; - -import org.eolang.AtCompositeTest; -import org.eolang.Data; -import org.eolang.Dataized; -import org.eolang.PhWith; -import org.eolang.Phi; -import org.hamcrest.MatcherAssert; -import org.hamcrest.Matchers; -import org.junit.jupiter.api.Test; - -/** - * Test case for {@link EOseq}. - * - * @since 0.16 - */ -public final class EOseqTest { - - @Test - public void calculatesAndReturns() { - MatcherAssert.assertThat( - AtCompositeTest.TO_ADD_MESSAGE, - new Dataized( - new PhWith( - new EOseq(), - 0, - new PhWith( - new PhWith( - new EOtuple$EOempty().take("with").copy(), - 0, new Data.ToPhi(0L) - ).take("with").copy(), - 0, new Data.ToPhi(1L) - ) - ) - ).take(Long.class), - Matchers.equalTo(1L) - ); - } - - @Test - public void calculatesAndReturnsObject() { - MatcherAssert.assertThat( - AtCompositeTest.TO_ADD_MESSAGE, - new Dataized( - new PhWith( - new EOseq(), - 0, - new PhWith( - new PhWith( - new EOtuple$EOempty().take("with").copy(), - 0, new Data.ToPhi(0L) - ).take("with").copy(), - 0, new Data.ToPhi("Hello!") - ) - ) - ).take(String.class), - Matchers.startsWith("Hello") - ); - } -}