« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/data/composite/wiki-data/withClonedThings.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/data/composite/wiki-data/withClonedThings.js')
-rw-r--r--src/data/composite/wiki-data/withClonedThings.js36
1 files changed, 30 insertions, 6 deletions
diff --git a/src/data/composite/wiki-data/withClonedThings.js b/src/data/composite/wiki-data/withClonedThings.js
index 9af6aa84..36c3ba54 100644
--- a/src/data/composite/wiki-data/withClonedThings.js
+++ b/src/data/composite/wiki-data/withClonedThings.js
@@ -3,9 +3,9 @@
 // 'assignEach' input is provided, each new thing is assigned the
 // corresponding properties.
 
-import CacheableObject from '#cacheable-object';
 import {input, templateCompositeFrom} from '#composite';
-import {isObject, sparseArrayOf} from '#validators';
+import Thing from '#thing';
+import {isObject, isThingClass, sparseArrayOf} from '#validators';
 
 import {withMappedList} from '#composite/data';
 
@@ -15,6 +15,16 @@ export default templateCompositeFrom({
   inputs: {
     things: input({type: 'array'}),
 
+    reclass: input({
+      validate: isThingClass,
+      defaultValue: null,
+    }),
+
+    reclassUnder: input({
+      validate: isThingClass,
+      defaultValue: null,
+    }),
+
     assign: input({
       type: 'object',
       defaultValue: null,
@@ -46,15 +56,29 @@ export default templateCompositeFrom({
     },
 
     {
-      dependencies: ['#assignmentMap'],
+      dependencies: [input('reclass'), input('reclassUnder')],
+      compute: (continuation, {
+        [input('reclass')]: reclass,
+        [input('reclassUnder')]: reclassUnder,
+      }) => continuation({
+        ['#cloneOperation']:
+          (reclassUnder && reclass
+            ? source => reclassUnder.clone(source, {as: reclass})
+         : reclass
+            ? source => Thing.clone(source, {as: reclass})
+            : source => Thing.clone(source)),
+      }),
+    },
+
+    {
+      dependencies: ['#assignmentMap', '#cloneOperation'],
       compute: (continuation, {
         ['#assignmentMap']: assignmentMap,
+        ['#cloneOperation']: cloneOperation,
       }) => continuation({
         ['#cloningMap']:
           (thing, index) =>
-            Object.assign(
-              CacheableObject.clone(thing),
-              assignmentMap(index)),
+            Object.assign(cloneOperation(thing), assignmentMap(index)),
       }),
     },