From 9398f911c1f2a480bda60511758825e595ce279b Mon Sep 17 00:00:00 2001 From: Hercules Merscher Date: Sun, 7 May 2023 13:19:49 +0200 Subject: [PATCH] std.compactArray recursively flattens multiple arrays --- doc/_stdlib_gen/stdlib-content.jsonnet | 14 ++++++++++++++ stdlib/std.jsonnet | 10 ++++++++++ test_suite/stdlib.jsonnet | 5 +++++ 3 files changed, 29 insertions(+) diff --git a/doc/_stdlib_gen/stdlib-content.jsonnet b/doc/_stdlib_gen/stdlib-content.jsonnet index 40de10df..b5b0c580 100644 --- a/doc/_stdlib_gen/stdlib-content.jsonnet +++ b/doc/_stdlib_gen/stdlib-content.jsonnet @@ -1349,6 +1349,20 @@ local html = import 'html.libsonnet'; }, ], }, + { + name: 'compactArrays', + params: ['arrs'], + availableSince: 'upcoming', + description: ||| + Concatenate an array of arrays into a single flattened array, removing null values. + |||, + examples: [ + { + input: 'std.compactArrays([[1, 2], [], [3, [4]], [[5, 6, [null]], [7, 8]]])', + output: std.compactArrays([1, 2, 3, 4, 5, 6, 7, 8]), + }, + ], + }, { name: 'reverse', params: ['arrs'], diff --git a/stdlib/std.jsonnet b/stdlib/std.jsonnet index 160dd7eb..a96d7bd5 100644 --- a/stdlib/std.jsonnet +++ b/stdlib/std.jsonnet @@ -865,6 +865,16 @@ limitations under the License. flattenArrays(arrs):: std.foldl(function(a, b) a + b, arrs, []), + compactArray(arrs):: + local foldable = function(accumulator, value) + if std.isArray(value) then + accumulator + std.compactArray(value) + else if value == null then + accumulator + else + accumulator + [value]; + std.foldl(foldable, arrs, []), + manifestIni(ini):: local body_lines(body) = std.join([], [ diff --git a/test_suite/stdlib.jsonnet b/test_suite/stdlib.jsonnet index 18639924..026326c0 100644 --- a/test_suite/stdlib.jsonnet +++ b/test_suite/stdlib.jsonnet @@ -313,6 +313,11 @@ std.assertEqual(std.lines(['a', null, 'b']), 'a\nb\n') && std.assertEqual(std.flattenArrays([[1, 2, 3], [4, 5, 6], []]), [1, 2, 3, 4, 5, 6]) && +std.assertEqual(std.compactArray([]), []) && +std.assertEqual(std.compactArray([1, 2, 3]), [1, 2, 3]) && +std.assertEqual(std.compactArray([1, [2, 3]]), [1, 2, 3]) && +std.assertEqual(std.compactArray([[1], [2, 3], []]), [1, 2, 3]) && + std.assertEqual( std.manifestIni({ main: { a: '1', b: '2' },