« get me outta code hell

withPropertyFromMainArtwork.js « artwork « 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/artwork/withPropertyFromMainArtwork.js
blob: a02331191a56140f74a2c39b15a174067570aecc (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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import {input, templateCompositeFrom} from '#composite';

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

import withContainingArtworkList from './withContainingArtworkList.js';

function getOutputName({
  [input.staticValue('property')]: property,
}) {
  if (property) {
    return `#mainArtwork.${property}`;
  } else {
    return '#value';
  }
}

export default templateCompositeFrom({
  annotation: `withPropertyFromMainArtwork`,

  inputs: {
    property: input({type: 'string'}),
    onlyIfAttached: input({type: 'boolean', defaultValue: false}),
  },

  outputs: inputs => [getOutputName(inputs)],

  steps: () => [
    {
      dependencies: [input.staticValue('property')],
      compute: (continuation, inputs) =>
        continuation({'#output': getOutputName(inputs)}),
    },

    {
      dependencies: [input('onlyIfAttached'), 'attachAbove', '#output'],
      compute: (continuation, {
        [input('onlyIfAttached')]: onlyIfAttached,
        ['attachAbove']: attachAbove,
        ['#output']: output,
      }) =>
        (onlyIfAttached && attachAbove
          ? continuation()
       : onlyIfAttached
          ? continuation.raiseOutput({[output]: null})
          : continuation()),
    },

    withContainingArtworkList(),

    withResultOfAvailabilityCheck({
      from: '#containingArtworkList',
    }),

    {
      dependencies: ['#availability', '#output'],
      compute: (continuation, {
        ['#availability']: availability,
        ['#output']: output,
      }) =>
        (availability
          ? continuation()
          : continuation.raiseOutput({[output]: null})),
    },

    {
      dependencies: ['#containingArtworkList'],
      compute: (continuation, {
        ['#containingArtworkList']: list,
      }) =>
        continuation({'#mainArtwork': list[0]}),
    },

    {
      dependencies: [input.myself(), '#mainArtwork', '#output'],
      compute: (continuation, {
        [input.myself()]: myself,
        ['#mainArtwork']: mainArtwork,
        ['#output']: output,
      }) =>
        (myself === mainArtwork
          ? continuation.raiseOutput({[output]: null})
          : continuation()),
    },

    withPropertyFromObject({
      object: '#mainArtwork',
      property: input('property'),
    }),

    {
      dependencies: ['#value', '#output'],
      compute: (continuation, {
        ['#value']: value,
        ['#output']: output,
      }) =>
        continuation.raiseOutput({[output]: value}),
    },
  ],
});