« 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
diff options
context:
space:
mode:
Diffstat (limited to 'src/data/composite/wiki-data')
-rw-r--r--src/data/composite/wiki-data/withClonedThings.js36
-rw-r--r--src/data/composite/wiki-data/withRecontextualizedContributionList.js14
-rw-r--r--src/data/composite/wiki-data/withResolvedContribs.js12
3 files changed, 50 insertions, 12 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)),
       }),
     },
 
diff --git a/src/data/composite/wiki-data/withRecontextualizedContributionList.js b/src/data/composite/wiki-data/withRecontextualizedContributionList.js
index bcc6e486..66ac056a 100644
--- a/src/data/composite/wiki-data/withRecontextualizedContributionList.js
+++ b/src/data/composite/wiki-data/withRecontextualizedContributionList.js
@@ -1,14 +1,15 @@
 // Clones all the contributions in a list, with thing and thingProperty both
 // updated to match the current thing. Overwrites the provided dependency.
-// Optionally updates artistProperty as well. Doesn't do anything if
-// the provided dependency is null.
+// Optionally updates artistProperty, and optionally reclasses as another
+// kind of contribution. Does nothing if the provided dependency is null.
 //
 // See also:
 //  - withRedatedContributionList
 //
 
 import {input, templateCompositeFrom} from '#composite';
-import {isStringNonEmpty} from '#validators';
+import thingConstructors from '#thing';
+import {isStringNonEmpty, isThingClass} from '#validators';
 
 import {withClonedThings} from '#composite/wiki-data';
 
@@ -21,6 +22,11 @@ export default templateCompositeFrom({
       acceptsNull: true,
     }),
 
+    reclass: input({
+      validate: isThingClass,
+      defaultValue: null,
+    }),
+
     artistProperty: input({
       validate: isStringNonEmpty,
       defaultValue: null,
@@ -77,6 +83,8 @@ export default templateCompositeFrom({
 
     withClonedThings({
       things: input('list'),
+      reclass: input('reclass'),
+      reclassUnder: input.value(thingConstructors.Contribution),
       assign: '#assignment',
     }).outputs({
       '#clonedThings': '#newContributions',
diff --git a/src/data/composite/wiki-data/withResolvedContribs.js b/src/data/composite/wiki-data/withResolvedContribs.js
index 0d96f1b7..3bbe1f81 100644
--- a/src/data/composite/wiki-data/withResolvedContribs.js
+++ b/src/data/composite/wiki-data/withResolvedContribs.js
@@ -82,27 +82,33 @@ export default templateCompositeFrom({
 
     withPropertiesFromList({
       list: input('from'),
-      properties: input.value(['artist', 'annotation']),
+      properties: input.value(['artist', 'artistText', 'annotation']),
       prefix: input.value('#contribs'),
     }),
 
     {
       dependencies: [
         '#contribs.artist',
+        '#contribs.artistText',
         '#contribs.annotation',
         input('date'),
       ],
 
       compute(continuation, {
         ['#contribs.artist']: artist,
+        ['#contribs.artistText']: artistText,
         ['#contribs.annotation']: annotation,
         [input('date')]: date,
       }) {
-        filterMultipleArrays(artist, annotation, (artist, _annotation) => artist);
+        filterMultipleArrays(
+          artist,
+          artistText,
+          annotation,
+          (artist, _artistText, _annotation) => artist);
 
         return continuation({
           ['#details']:
-            stitchArrays({artist, annotation})
+            stitchArrays({artist, artistText, annotation})
               .map(details => ({
                 ...details,
                 date: date ?? null,