From 3b6504d3b13b7153ff533df805d9d1901dba94c5 Mon Sep 17 00:00:00 2001 From: sergeych Date: Tue, 23 Dec 2025 18:06:28 +0100 Subject: [PATCH] Add `flatten`, `flatMap`, and `filterNotNull` functions with corresponding tests --- lynglib/src/commonTest/kotlin/StdlibTest.kt | 15 +++++++++++ lynglib/stdlib/lyng/root.lyng | 28 +++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/lynglib/src/commonTest/kotlin/StdlibTest.kt b/lynglib/src/commonTest/kotlin/StdlibTest.kt index af9f3bc..3e07f6a 100644 --- a/lynglib/src/commonTest/kotlin/StdlibTest.kt +++ b/lynglib/src/commonTest/kotlin/StdlibTest.kt @@ -91,4 +91,19 @@ class StdlibTest { assertEquals([1,2], (1..8).dropLast(6).toList() ) """.trimIndent()) } + + @Test + fun testFlattenAndFilter() = runTest { + eval(""" + assertEquals([1,2,3,4,5,6], [1,3,5].map { [it, it+1] }.flatten() ) + assertEquals([1,3,5], [null,1,null, 3,5].filterNotNull().toList()) + """) + } + + @Test + fun testFlatMap() = runTest { + eval(""" + assertEquals([1,2,3,4,5,6], [1,3,5].flatMap { [it,it+1] }.toList() ) + """) + } } \ No newline at end of file diff --git a/lynglib/stdlib/lyng/root.lyng b/lynglib/stdlib/lyng/root.lyng index fb247f2..f8f11b4 100644 --- a/lynglib/stdlib/lyng/root.lyng +++ b/lynglib/stdlib/lyng/root.lyng @@ -27,6 +27,14 @@ fun Iterable.filter(predicate) { } } +/* +filter out all null elements from this collection (Iterable); collection of +non-null elements is returned +*/ +fun Iterable.filterNotNull() { + filter { it != null } +} + /* Skip the first N elements of this iterable. */ fun Iterable.drop(n) { var cnt = 0 @@ -179,6 +187,26 @@ fun Iterable.shuffled() { toList().apply { shuffle() } } +/* +Returns a single list of all elements from all collections in the given collection. +@return List +*/ +fun Iterable.flatten() { + val result = [] + forEach { i -> + i.forEach { result.add(it) } + } + result +} + +/* +Returns a single list of all elements yielded from results of transform function being +invoked on each element of original collection. +*/ +fun Iterable.flatMap(transform): List { + map(transform).flatten() +} + /* Return string representation like [a,b,c]. */ fun List.toString() { "[" + joinToString(",") + "]"