« 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/constituteFrom.js31
-rw-r--r--src/data/composite/wiki-data/constituteOrContinue.js34
-rw-r--r--src/data/composite/wiki-data/gobbleSoupyFind.js2
-rw-r--r--src/data/composite/wiki-data/gobbleSoupyReverse.js2
-rw-r--r--src/data/composite/wiki-data/helpers/withSimpleDirectory.js2
-rw-r--r--src/data/composite/wiki-data/index.js7
-rw-r--r--src/data/composite/wiki-data/inputFindOptions.js5
-rw-r--r--src/data/composite/wiki-data/splitContentNodesAround.js100
-rw-r--r--src/data/composite/wiki-data/withConstitutedArtwork.js5
-rw-r--r--src/data/composite/wiki-data/withContentNodes.js25
-rw-r--r--src/data/composite/wiki-data/withCoverArtDate.js51
-rw-r--r--src/data/composite/wiki-data/withDirectory.js4
-rw-r--r--src/data/composite/wiki-data/withResolvedAnnotatedReferenceList.js9
-rw-r--r--src/data/composite/wiki-data/withResolvedContribs.js5
-rw-r--r--src/data/composite/wiki-data/withResolvedReference.js22
-rw-r--r--src/data/composite/wiki-data/withResolvedReferenceList.js21
-rw-r--r--src/data/composite/wiki-data/withResolvedSeriesList.js130
17 files changed, 255 insertions, 200 deletions
diff --git a/src/data/composite/wiki-data/constituteFrom.js b/src/data/composite/wiki-data/constituteFrom.js
new file mode 100644
index 00000000..b919d5cd
--- /dev/null
+++ b/src/data/composite/wiki-data/constituteFrom.js
@@ -0,0 +1,31 @@
+import {input, templateCompositeFrom} from '#composite';
+
+import {inputAvailabilityCheckMode,} from '#composite/control-flow';
+
+import constituteOrContinue from './constituteOrContinue.js';
+
+export default templateCompositeFrom({
+  annotation: `constituteFrom`,
+
+  inputs: {
+    object: input({type: 'object', acceptsNull: true}),
+    property: input({type: 'string', acceptsNull: true}),
+    else: input({defaultValue: null}),
+    mode: inputAvailabilityCheckMode(),
+  },
+
+  compose: false,
+
+  steps: () => [
+    constituteOrContinue({
+      object: input('object'),
+      property: input('property'),
+      mode: input('mode'),
+    }),
+
+    {
+      dependencies: [input('else')],
+      compute: ({[input('else')]: fallback}) => fallback,
+    },
+  ],
+});
diff --git a/src/data/composite/wiki-data/constituteOrContinue.js b/src/data/composite/wiki-data/constituteOrContinue.js
new file mode 100644
index 00000000..92b941ba
--- /dev/null
+++ b/src/data/composite/wiki-data/constituteOrContinue.js
@@ -0,0 +1,34 @@
+import {input, templateCompositeFrom} from '#composite';
+
+import {withPropertyFromObject} from '#composite/data';
+
+import {
+  exposeDependencyOrContinue,
+  inputAvailabilityCheckMode,
+  raiseOutputWithoutDependency,
+} from '#composite/control-flow';
+
+export default templateCompositeFrom({
+  annotation: `constituteFrom`,
+
+  inputs: {
+    object: input({type: 'object', acceptsNull: true}),
+    property: input({type: 'string', acceptsNull: true}),
+    mode: inputAvailabilityCheckMode(),
+  },
+
+  steps: () => [
+    raiseOutputWithoutDependency({
+      dependency: input('property'),
+    }),
+
+    withPropertyFromObject({
+      object: input('object'),
+      property: input('property'),
+    }),
+
+    exposeDependencyOrContinue({
+      dependency: '#value',
+    }),
+  ],
+});
diff --git a/src/data/composite/wiki-data/gobbleSoupyFind.js b/src/data/composite/wiki-data/gobbleSoupyFind.js
index aec3f5b1..98d5f5c9 100644
--- a/src/data/composite/wiki-data/gobbleSoupyFind.js
+++ b/src/data/composite/wiki-data/gobbleSoupyFind.js
@@ -30,7 +30,7 @@ export default templateCompositeFrom({
     },
 
     withPropertyFromObject({
-      object: 'find',
+      object: '_find',
       property: '#key',
     }).outputs({
       '#value': '#find',
diff --git a/src/data/composite/wiki-data/gobbleSoupyReverse.js b/src/data/composite/wiki-data/gobbleSoupyReverse.js
index 86a1061c..26052f28 100644
--- a/src/data/composite/wiki-data/gobbleSoupyReverse.js
+++ b/src/data/composite/wiki-data/gobbleSoupyReverse.js
@@ -30,7 +30,7 @@ export default templateCompositeFrom({
     },
 
     withPropertyFromObject({
-      object: 'reverse',
+      object: '_reverse',
       property: '#key',
     }).outputs({
       '#value': '#reverse',
diff --git a/src/data/composite/wiki-data/helpers/withSimpleDirectory.js b/src/data/composite/wiki-data/helpers/withSimpleDirectory.js
index 08ca3bfc..0b225847 100644
--- a/src/data/composite/wiki-data/helpers/withSimpleDirectory.js
+++ b/src/data/composite/wiki-data/helpers/withSimpleDirectory.js
@@ -15,7 +15,7 @@ export default templateCompositeFrom({
   inputs: {
     directory: input({
       validate: isDirectory,
-      defaultDependency: 'directory',
+      defaultDependency: '_directory',
       acceptsNull: true,
     }),
 
diff --git a/src/data/composite/wiki-data/index.js b/src/data/composite/wiki-data/index.js
index 005c68c0..41f34d21 100644
--- a/src/data/composite/wiki-data/index.js
+++ b/src/data/composite/wiki-data/index.js
@@ -4,17 +4,21 @@
 // #composite/data.
 //
 
+export {default as constituteFrom} from './constituteFrom.js';
+export {default as constituteOrContinue} from './constituteOrContinue.js';
 export {default as exitWithoutContribs} from './exitWithoutContribs.js';
 export {default as gobbleSoupyFind} from './gobbleSoupyFind.js';
 export {default as gobbleSoupyReverse} from './gobbleSoupyReverse.js';
+export {default as inputFindOptions} from './inputFindOptions.js';
 export {default as inputNotFoundMode} from './inputNotFoundMode.js';
 export {default as inputSoupyFind} from './inputSoupyFind.js';
 export {default as inputSoupyReverse} from './inputSoupyReverse.js';
 export {default as inputWikiData} from './inputWikiData.js';
+export {default as splitContentNodesAround} from './splitContentNodesAround.js';
 export {default as withClonedThings} from './withClonedThings.js';
 export {default as withConstitutedArtwork} from './withConstitutedArtwork.js';
+export {default as withContentNodes} from './withContentNodes.js';
 export {default as withContributionListSums} from './withContributionListSums.js';
-export {default as withCoverArtDate} from './withCoverArtDate.js';
 export {default as withDirectory} from './withDirectory.js';
 export {default as withRecontextualizedContributionList} from './withRecontextualizedContributionList.js';
 export {default as withRedatedContributionList} from './withRedatedContributionList.js';
@@ -22,7 +26,6 @@ export {default as withResolvedAnnotatedReferenceList} from './withResolvedAnnot
 export {default as withResolvedContribs} from './withResolvedContribs.js';
 export {default as withResolvedReference} from './withResolvedReference.js';
 export {default as withResolvedReferenceList} from './withResolvedReferenceList.js';
-export {default as withResolvedSeriesList} from './withResolvedSeriesList.js';
 export {default as withReverseReferenceList} from './withReverseReferenceList.js';
 export {default as withThingsSortedAlphabetically} from './withThingsSortedAlphabetically.js';
 export {default as withUniqueReferencingThing} from './withUniqueReferencingThing.js';
diff --git a/src/data/composite/wiki-data/inputFindOptions.js b/src/data/composite/wiki-data/inputFindOptions.js
new file mode 100644
index 00000000..07ed4bce
--- /dev/null
+++ b/src/data/composite/wiki-data/inputFindOptions.js
@@ -0,0 +1,5 @@
+import {input} from '#composite';
+
+export default function inputFindOptions() {
+  return input({type: 'object', defaultValue: null});
+}
diff --git a/src/data/composite/wiki-data/splitContentNodesAround.js b/src/data/composite/wiki-data/splitContentNodesAround.js
new file mode 100644
index 00000000..f12bd8fc
--- /dev/null
+++ b/src/data/composite/wiki-data/splitContentNodesAround.js
@@ -0,0 +1,100 @@
+import {input, templateCompositeFrom} from '#composite';
+import {splitContentNodesAround} from '#replacer';
+import {anyOf, isFunction, validateInstanceOf} from '#validators';
+
+import {withAvailabilityFilter} from '#composite/control-flow';
+import {withFilteredList, withMappedList, withUnflattenedList}
+  from '#composite/data';
+
+export default templateCompositeFrom({
+  annotation: `splitContentNodesAround`,
+
+  inputs: {
+    nodes: input({type: 'array'}),
+
+    around: input({
+      validate:
+        anyOf(isFunction, validateInstanceOf(RegExp)),
+    }),
+  },
+
+  outputs: ['#contentNodeLists'],
+
+  steps: () => [
+    {
+      dependencies: [input('nodes'), input('around')],
+
+      compute: (continuation, {
+        [input('nodes')]: nodes,
+        [input('around')]: splitter,
+      }) => continuation({
+        ['#nodes']:
+          Array.from(splitContentNodesAround(nodes, splitter)),
+      }),
+    },
+
+    withMappedList({
+      list: '#nodes',
+      map: input.value(node => node.type === 'separator'),
+    }).outputs({
+      '#mappedList': '#separatorFilter',
+    }),
+
+    withMappedList({
+      list: '#separatorFilter',
+      map: input.value((_node, index) => index),
+      filter: '#separatorFilter',
+    }),
+
+    withFilteredList({
+      list: '#mappedList',
+      filter: '#separatorFilter',
+    }).outputs({
+      '#filteredList': '#separatorIndices',
+    }),
+
+    {
+      dependencies: ['#nodes', '#separatorFilter'],
+
+      compute: (continuation, {
+        ['#nodes']: nodes,
+        ['#separatorFilter']: separatorFilter,
+      }) => continuation({
+        ['#nodes']:
+          nodes.map((node, index) =>
+            (separatorFilter[index]
+              ? null
+              : node)),
+      }),
+    },
+
+    {
+      dependencies: ['#separatorIndices'],
+      compute: (continuation, {
+        ['#separatorIndices']: separatorIndices,
+      }) => continuation({
+        ['#unflattenIndices']:
+          [0, ...separatorIndices],
+      }),
+    },
+
+    withUnflattenedList({
+      list: '#nodes',
+      indices: '#unflattenIndices',
+    }).outputs({
+      '#unflattenedList': '#contentNodeLists',
+    }),
+
+    withAvailabilityFilter({
+      from: '#contentNodeLists',
+      mode: input.value('empty'),
+    }),
+
+    withFilteredList({
+      list: '#contentNodeLists',
+      filter: '#availabilityFilter',
+    }).outputs({
+      '#filteredList': '#contentNodeLists',
+    }),
+  ],
+});
diff --git a/src/data/composite/wiki-data/withConstitutedArtwork.js b/src/data/composite/wiki-data/withConstitutedArtwork.js
index 9e260abf..28d719e2 100644
--- a/src/data/composite/wiki-data/withConstitutedArtwork.js
+++ b/src/data/composite/wiki-data/withConstitutedArtwork.js
@@ -1,11 +1,11 @@
 import {input, templateCompositeFrom} from '#composite';
 import thingConstructors from '#things';
-import {isContributionList} from '#validators';
 
 export default templateCompositeFrom({
   annotation: `withConstitutedArtwork`,
 
   inputs: {
+    thingProperty: input({type: 'string', acceptsNull: true}),
     dimensionsFromThingProperty: input({type: 'string', acceptsNull: true}),
     fileExtensionFromThingProperty: input({type: 'string', acceptsNull: true}),
     dateFromThingProperty: input({type: 'string', acceptsNull: true}),
@@ -21,6 +21,7 @@ export default templateCompositeFrom({
     {
       dependencies: [
         input.myself(),
+        input('thingProperty'),
         input('dimensionsFromThingProperty'),
         input('fileExtensionFromThingProperty'),
         input('dateFromThingProperty'),
@@ -32,6 +33,7 @@ export default templateCompositeFrom({
 
       compute: (continuation, {
         [input.myself()]: myself,
+        [input('thingProperty')]: thingProperty,
         [input('dimensionsFromThingProperty')]: dimensionsFromThingProperty,
         [input('fileExtensionFromThingProperty')]: fileExtensionFromThingProperty,
         [input('dateFromThingProperty')]: dateFromThingProperty,
@@ -43,6 +45,7 @@ export default templateCompositeFrom({
         ['#constitutedArtwork']:
           Object.assign(new thingConstructors.Artwork, {
             thing: myself,
+            thingProperty,
             dimensionsFromThingProperty,
             fileExtensionFromThingProperty,
             artistContribsFromThingProperty,
diff --git a/src/data/composite/wiki-data/withContentNodes.js b/src/data/composite/wiki-data/withContentNodes.js
new file mode 100644
index 00000000..d014d43b
--- /dev/null
+++ b/src/data/composite/wiki-data/withContentNodes.js
@@ -0,0 +1,25 @@
+import {input, templateCompositeFrom} from '#composite';
+import {parseContentNodes} from '#replacer';
+
+export default templateCompositeFrom({
+  annotation: `withContentNodes`,
+
+  inputs: {
+    from: input({type: 'string', acceptsNull: false}),
+  },
+
+  outputs: ['#contentNodes'],
+
+  steps: () => [
+    {
+      dependencies: [input('from')],
+
+      compute: (continuation, {
+        [input('from')]: string,
+      }) => continuation({
+        ['#contentNodes']:
+          parseContentNodes(string),
+      }),
+    },
+  ],
+});
diff --git a/src/data/composite/wiki-data/withCoverArtDate.js b/src/data/composite/wiki-data/withCoverArtDate.js
deleted file mode 100644
index a114d5ff..00000000
--- a/src/data/composite/wiki-data/withCoverArtDate.js
+++ /dev/null
@@ -1,51 +0,0 @@
-import {input, templateCompositeFrom} from '#composite';
-import {isDate} from '#validators';
-
-import {raiseOutputWithoutDependency} from '#composite/control-flow';
-
-import withResolvedContribs from './withResolvedContribs.js';
-
-export default templateCompositeFrom({
-  annotation: `withCoverArtDate`,
-
-  inputs: {
-    from: input({
-      validate: isDate,
-      defaultDependency: 'coverArtDate',
-      acceptsNull: true,
-    }),
-  },
-
-  outputs: ['#coverArtDate'],
-
-  steps: () => [
-    withResolvedContribs({
-      from: 'coverArtistContribs',
-      date: input.value(null),
-    }),
-
-    raiseOutputWithoutDependency({
-      dependency: '#resolvedContribs',
-      mode: input.value('empty'),
-      output: input.value({'#coverArtDate': null}),
-    }),
-
-    {
-      dependencies: [input('from')],
-      compute: (continuation, {
-        [input('from')]: from,
-      }) =>
-        (from
-          ? continuation.raiseOutput({'#coverArtDate': from})
-          : continuation()),
-    },
-
-    {
-      dependencies: ['date'],
-      compute: (continuation, {date}) =>
-        (date
-          ? continuation({'#coverArtDate': date})
-          : continuation({'#coverArtDate': null})),
-    },
-  ],
-});
diff --git a/src/data/composite/wiki-data/withDirectory.js b/src/data/composite/wiki-data/withDirectory.js
index f3bedf2e..e7c3960e 100644
--- a/src/data/composite/wiki-data/withDirectory.js
+++ b/src/data/composite/wiki-data/withDirectory.js
@@ -17,13 +17,13 @@ export default templateCompositeFrom({
   inputs: {
     directory: input({
       validate: isDirectory,
-      defaultDependency: 'directory',
+      defaultDependency: '_directory',
       acceptsNull: true,
     }),
 
     name: input({
       validate: isName,
-      defaultDependency: 'name',
+      defaultDependency: '_name',
       acceptsNull: true,
     }),
 
diff --git a/src/data/composite/wiki-data/withResolvedAnnotatedReferenceList.js b/src/data/composite/wiki-data/withResolvedAnnotatedReferenceList.js
index 9cc52f29..71bc56ac 100644
--- a/src/data/composite/wiki-data/withResolvedAnnotatedReferenceList.js
+++ b/src/data/composite/wiki-data/withResolvedAnnotatedReferenceList.js
@@ -7,6 +7,7 @@ import {withPropertyFromList} from '#composite/data';
 import {raiseOutputWithoutDependency, withAvailabilityFilter}
   from '#composite/control-flow';
 
+import inputFindOptions from './inputFindOptions.js';
 import inputSoupyFind from './inputSoupyFind.js';
 import inputNotFoundMode from './inputNotFoundMode.js';
 import inputWikiData from './inputWikiData.js';
@@ -22,13 +23,14 @@ export default templateCompositeFrom({
       acceptsNull: true,
     }),
 
+    data: inputWikiData({allowMixedTypes: true}),
+    find: inputSoupyFind(),
+    findOptions: inputFindOptions(),
+
     reference: input({type: 'string', defaultValue: 'reference'}),
     annotation: input({type: 'string', defaultValue: 'annotation'}),
     thing: input({type: 'string', defaultValue: 'thing'}),
 
-    data: inputWikiData({allowMixedTypes: true}),
-    find: inputSoupyFind(),
-
     notFoundMode: inputNotFoundMode(),
   },
 
@@ -61,6 +63,7 @@ export default templateCompositeFrom({
       list: '#references',
       data: input('data'),
       find: input('find'),
+      findOptions: input('findOptions'),
       notFoundMode: input.value('null'),
     }),
 
diff --git a/src/data/composite/wiki-data/withResolvedContribs.js b/src/data/composite/wiki-data/withResolvedContribs.js
index 838c991f..7729d5b6 100644
--- a/src/data/composite/wiki-data/withResolvedContribs.js
+++ b/src/data/composite/wiki-data/withResolvedContribs.js
@@ -28,6 +28,7 @@ export default templateCompositeFrom({
     date: input({
       validate: isDate,
       acceptsNull: true,
+      defaultDependency: 'date',
     }),
 
     notFoundMode: inputNotFoundMode(),
@@ -110,7 +111,7 @@ export default templateCompositeFrom({
         '#thingProperty',
         input('artistProperty'),
         input.myself(),
-        'find',
+        '_find',
       ],
 
       compute: (continuation, {
@@ -118,7 +119,7 @@ export default templateCompositeFrom({
         ['#thingProperty']: thingProperty,
         [input('artistProperty')]: artistProperty,
         [input.myself()]: myself,
-        ['find']: find,
+        ['_find']: find,
       }) => continuation({
         ['#contributions']:
           details.map(details => {
diff --git a/src/data/composite/wiki-data/withResolvedReference.js b/src/data/composite/wiki-data/withResolvedReference.js
index 6f422194..d9a05367 100644
--- a/src/data/composite/wiki-data/withResolvedReference.js
+++ b/src/data/composite/wiki-data/withResolvedReference.js
@@ -8,6 +8,7 @@ import {input, templateCompositeFrom} from '#composite';
 import {raiseOutputWithoutDependency} from '#composite/control-flow';
 
 import gobbleSoupyFind from './gobbleSoupyFind.js';
+import inputFindOptions from './inputFindOptions.js';
 import inputSoupyFind from './inputSoupyFind.js';
 import inputWikiData from './inputWikiData.js';
 
@@ -17,8 +18,9 @@ export default templateCompositeFrom({
   inputs: {
     ref: input({type: 'string', acceptsNull: true}),
 
-    data: inputWikiData({allowMixedTypes: false}),
+    data: inputWikiData({allowMixedTypes: true}),
     find: inputSoupyFind(),
+    findOptions: inputFindOptions(),
   },
 
   outputs: ['#resolvedReference'],
@@ -36,21 +38,35 @@ export default templateCompositeFrom({
     }),
 
     {
+      dependencies: [input('findOptions')],
+      compute: (continuation, {
+        [input('findOptions')]: findOptions,
+      }) => continuation({
+        ['#findOptions']:
+          (findOptions
+            ? {...findOptions, mode: 'quiet'}
+            : {mode: 'quiet'}),
+      }),
+    },
+
+    {
       dependencies: [
         input('ref'),
         input('data'),
         '#find',
+        '#findOptions',
       ],
 
       compute: (continuation, {
         [input('ref')]: ref,
         [input('data')]: data,
         ['#find']: findFunction,
+        ['#findOptions']: findOptions,
       }) => continuation({
         ['#resolvedReference']:
           (data
-            ? findFunction(ref, data, {mode: 'quiet'}) ?? null
-            : findFunction(ref, {mode: 'quiet'}) ?? null),
+            ? findFunction(ref, data, findOptions) ?? null
+            : findFunction(ref, findOptions) ?? null),
       }),
     },
   ],
diff --git a/src/data/composite/wiki-data/withResolvedReferenceList.js b/src/data/composite/wiki-data/withResolvedReferenceList.js
index 9dc960dd..14ce6919 100644
--- a/src/data/composite/wiki-data/withResolvedReferenceList.js
+++ b/src/data/composite/wiki-data/withResolvedReferenceList.js
@@ -11,6 +11,7 @@ import {raiseOutputWithoutDependency, withAvailabilityFilter}
 import {withMappedList} from '#composite/data';
 
 import gobbleSoupyFind from './gobbleSoupyFind.js';
+import inputFindOptions from './inputFindOptions.js';
 import inputNotFoundMode from './inputNotFoundMode.js';
 import inputSoupyFind from './inputSoupyFind.js';
 import inputWikiData from './inputWikiData.js';
@@ -27,6 +28,7 @@ export default templateCompositeFrom({
 
     data: inputWikiData({allowMixedTypes: true}),
     find: inputSoupyFind(),
+    findOptions: inputFindOptions(),
 
     notFoundMode: inputNotFoundMode(),
   },
@@ -47,15 +49,28 @@ export default templateCompositeFrom({
     }),
 
     {
-      dependencies: [input('data'), '#find'],
+      dependencies: [input('findOptions')],
+      compute: (continuation, {
+        [input('findOptions')]: findOptions,
+      }) => continuation({
+        ['#findOptions']:
+          (findOptions
+            ? {...findOptions, mode: 'quiet'}
+            : {mode: 'quiet'}),
+      }),
+    },
+
+    {
+      dependencies: [input('data'), '#find', '#findOptions'],
       compute: (continuation, {
         [input('data')]: data,
         ['#find']: findFunction,
+        ['#findOptions']: findOptions,
       }) => continuation({
         ['#map']:
           (data
-            ? ref => findFunction(ref, data, {mode: 'quiet'})
-            : ref => findFunction(ref, {mode: 'quiet'})),
+            ? ref => findFunction(ref, data, findOptions)
+            : ref => findFunction(ref, findOptions)),
       }),
     },
 
diff --git a/src/data/composite/wiki-data/withResolvedSeriesList.js b/src/data/composite/wiki-data/withResolvedSeriesList.js
deleted file mode 100644
index deaab466..00000000
--- a/src/data/composite/wiki-data/withResolvedSeriesList.js
+++ /dev/null
@@ -1,130 +0,0 @@
-import {input, templateCompositeFrom} from '#composite';
-import {stitchArrays} from '#sugar';
-import {isSeriesList, validateThing} from '#validators';
-
-import {raiseOutputWithoutDependency} from '#composite/control-flow';
-
-import {
-  fillMissingListItems,
-  withFlattenedList,
-  withUnflattenedList,
-  withPropertiesFromList,
-} from '#composite/data';
-
-import inputSoupyFind from './inputSoupyFind.js';
-import withResolvedReferenceList from './withResolvedReferenceList.js';
-
-export default templateCompositeFrom({
-  annotation: `withResolvedSeriesList`,
-
-  inputs: {
-    group: input({
-      validate: validateThing({referenceType: 'group'}),
-    }),
-
-    list: input({
-      validate: isSeriesList,
-      acceptsNull: true,
-    }),
-  },
-
-  outputs: ['#resolvedSeriesList'],
-
-  steps: () => [
-    raiseOutputWithoutDependency({
-      dependency: input('list'),
-      mode: input.value('empty'),
-      output: input.value({
-        ['#resolvedSeriesList']: [],
-      }),
-    }),
-
-    withPropertiesFromList({
-      list: input('list'),
-      prefix: input.value('#serieses'),
-      properties: input.value([
-        'name',
-        'description',
-        'albums',
-
-        'showAlbumArtists',
-      ]),
-    }),
-
-    fillMissingListItems({
-      list: '#serieses.albums',
-      fill: input.value([]),
-    }),
-
-    withFlattenedList({
-      list: '#serieses.albums',
-    }),
-
-    withResolvedReferenceList({
-      list: '#flattenedList',
-      find: inputSoupyFind.input('album'),
-      notFoundMode: input.value('null'),
-    }),
-
-    withUnflattenedList({
-      list: '#resolvedReferenceList',
-    }).outputs({
-      '#unflattenedList': '#serieses.albums',
-    }),
-
-    fillMissingListItems({
-      list: '#serieses.description',
-      fill: input.value(null),
-    }),
-
-    fillMissingListItems({
-      list: '#serieses.showAlbumArtists',
-      fill: input.value(null),
-    }),
-
-    {
-      dependencies: [
-        '#serieses.name',
-        '#serieses.description',
-        '#serieses.albums',
-
-        '#serieses.showAlbumArtists',
-      ],
-
-      compute: (continuation, {
-        ['#serieses.name']: name,
-        ['#serieses.description']: description,
-        ['#serieses.albums']: albums,
-
-        ['#serieses.showAlbumArtists']: showAlbumArtists,
-      }) => continuation({
-        ['#seriesProperties']:
-          stitchArrays({
-            name,
-            description,
-            albums,
-
-            showAlbumArtists,
-          }).map(properties => ({
-              ...properties,
-              group: input
-            }))
-      }),
-    },
-
-    {
-      dependencies: ['#seriesProperties', input('group')],
-      compute: (continuation, {
-        ['#seriesProperties']: seriesProperties,
-        [input('group')]: group,
-      }) => continuation({
-        ['#resolvedSeriesList']:
-          seriesProperties
-            .map(properties => ({
-              ...properties,
-              group,
-            })),
-      }),
-    },
-  ],
-});