« get me outta code hell

withInferredAdditionalNames.js « track « things « composite « data « src - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/data/composite/things/track/withInferredAdditionalNames.js
blob: 659d6b8f03173602fb4e13f4dcfa016d1b61f24b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// Infers additional name entries from other releases that were titled
// differently, linking to the respective release via annotation.

import {input, templateCompositeFrom} from '#composite';
import {stitchArrays} from '#sugar';

import {raiseOutputWithoutDependency} from '#composite/control-flow';
import {withPropertiesFromList, withPropertyFromList} from '#composite/data';

import withOtherReleases from './withOtherReleases.js';

export default templateCompositeFrom({
  annotation: `withInferredAdditionalNames`,

  outputs: ['#inferredAdditionalNames'],

  steps: () => [
    withOtherReleases(),

    raiseOutputWithoutDependency({
      dependency: '#otherReleases',
      mode: input.value('empty'),
      output: input.value({'#inferredAdditionalNames': []}),
    }),

    {
      dependencies: ['#otherReleases', 'name'],
      compute: (continuation, {
        ['#otherReleases']: otherReleases,
        ['name']: name,
      }) => continuation({
        ['#differentlyNamedReleases']:
          otherReleases.filter(release => release.name !== name),
      }),
    },

    withPropertiesFromList({
      list: '#differentlyNamedReleases',
      properties: input.value(['name', 'directory', 'album']),
    }),

    withPropertyFromList({
      list: '#differentlyNamedReleases.album',
      property: input.value('name'),
    }),

    {
      dependencies: [
        '#differentlyNamedReleases.directory',
        '#differentlyNamedReleases.album.name',
      ],

      compute: (continuation, {
        ['#differentlyNamedReleases.directory']: trackDirectories,
        ['#differentlyNamedReleases.album.name']: albumNames,
      }) => continuation({
        ['#annotations']:
          stitchArrays({
            trackDirectory: trackDirectories,
            albumName: albumNames,
          }).map(({trackDirectory, albumName}) =>
              `[[track:${trackDirectory}|on ${albumName}]]`)
      })
    },

    {
      dependencies: ['#differentlyNamedReleases.name', '#annotations'],
      compute: (continuation, {
        ['#differentlyNamedReleases.name']: names,
        ['#annotations']: annotations,
      }) => continuation({
        ['#inferredAdditionalNames']:
          stitchArrays({
            name: names,
            annotation: annotations,
          }),
      }),
    },
  ],
});