« get me outta code hell

withAllReleases.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/withAllReleases.js
blob: b93bf753dd02d047e10c3512099dbf6800f55834 (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
// Gets all releases of the current track. All items of the outputs are
// distinct Track objects; one track is the main release; all else are
// secondary releases of that main release; and one item, which may be
// the main release or one of the secondary releases, is the current
// track. The results are sorted by date, and it is possible that the
// main release is not actually the earliest/first.

import {input, templateCompositeFrom} from '#composite';
import {sortByDate} from '#sort';

import {exitWithoutDependency} from '#composite/control-flow';
import {withPropertyFromObject} from '#composite/data';

import withMainRelease from './withMainRelease.js';

export default templateCompositeFrom({
  annotation: `withAllReleases`,

  outputs: ['#allReleases'],

  steps: () => [
    withMainRelease({
      selfIfMain: input.value(true),
      notFoundValue: input.value([]),
    }),

    // We don't talk about bruno no no
    // Yes, this can perform a normal access equivalent to
    // `this.secondaryReleases` from within a data composition.
    // Oooooooooooooooooooooooooooooooooooooooooooooooo
    withPropertyFromObject({
      object: '#mainRelease',
      property: input.value('secondaryReleases'),
    }),

    {
      dependencies: ['#mainRelease', '#mainRelease.secondaryReleases'],
      compute: (continuation, {
        ['#mainRelease']: mainRelease,
        ['#mainRelease.secondaryReleases']: secondaryReleases,
      }) => continuation({
        ['#allReleases']:
          sortByDate([mainRelease, ...secondaryReleases]),
      }),
    },
  ],
});