« get me outta code hell

data, test: withUniqueItemsOnly (#composite/data) - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/data/composite/data/withUniqueItemsOnly.js
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2023-11-18 20:15:07 -0400
committer(quasar) nebula <qznebula@protonmail.com>2023-11-18 20:15:49 -0400
commitf82b74f62595c4def21b176c366c703da02c331e (patch)
tree811b6db15a3fe5c03171bce0f0069e9a0f328700 /src/data/composite/data/withUniqueItemsOnly.js
parent6cbd8ee458a25ed8608760f8867008aa8f55d5e3 (diff)
data, test: withUniqueItemsOnly (#composite/data)
Diffstat (limited to 'src/data/composite/data/withUniqueItemsOnly.js')
-rw-r--r--src/data/composite/data/withUniqueItemsOnly.js40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/data/composite/data/withUniqueItemsOnly.js b/src/data/composite/data/withUniqueItemsOnly.js
new file mode 100644
index 0000000..7ee08b0
--- /dev/null
+++ b/src/data/composite/data/withUniqueItemsOnly.js
@@ -0,0 +1,40 @@
+// Excludes duplicate items from a list and provides the results, overwriting
+// the list in-place, if possible.
+
+import {input, templateCompositeFrom} from '#composite';
+import {unique} from '#sugar';
+
+export default templateCompositeFrom({
+  annotation: `withUniqueItemsOnly`,
+
+  inputs: {
+    list: input({type: 'array'}),
+  },
+
+  outputs: ({
+    [input.staticDependency('list')]: list,
+  }) => [list ?? '#uniqueItems'],
+
+  steps: () => [
+    {
+      dependencies: [input('list')],
+      compute: (continuation, {
+        [input('list')]: list,
+      }) => continuation({
+        ['#values']:
+          unique(list),
+      }),
+    },
+
+    {
+      dependencies: ['#values', input.staticDependency('list')],
+      compute: (continuation, {
+        '#values': values,
+        [input.staticDependency('list')]: list,
+      }) => continuation({
+        [list ?? '#uniqueItems']:
+          values,
+      }),
+    },
+  ],
+});