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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
// Clones all the contributions in a list, with date updated to the provided
// value. Overwrites the provided dependency. Doesn't do anything if the
// provided dependency is null, or the provided date is null.
//
// If 'override' is true (the default), then so long as the provided date has
// a value at all, it's always written onto the (cloned) contributions.
//
// If 'override' is false, and any of the contributions were already dated,
// those will keep their existing dates.
//
// See also:
// - withRecontextualizedContributionList
//
import {input, templateCompositeFrom} from '#composite';
import {isDate} from '#validators';
import {withMappedList, withPropertyFromList} from '#composite/data';
import {withClonedThings} from '#composite/wiki-data';
export default templateCompositeFrom({
annotation: `withRedatedContributionList`,
inputs: {
list: input.staticDependency({
type: 'array',
acceptsNull: true,
}),
date: input({
validate: isDate,
acceptsNull: true,
}),
override: input({
type: 'boolean',
defaultValue: true,
}),
},
outputs: ({
[input.staticDependency('list')]: list,
}) => [list],
steps: () => [
// TODO: Is raiseOutputWithoutDependency workable here?
// Is it true that not specifying any output wouldn't overwrite
// the provided dependency?
{
dependencies: [
input.staticDependency('list'),
input('list'),
input('date'),
],
compute: (continuation, {
[input.staticDependency('list')]: dependency,
[input('list')]: list,
[input('date')]: date,
}) =>
(list && date
? continuation()
: continuation.raiseOutput({
[dependency]: list,
})),
},
withPropertyFromList({
list: input('list'),
property: input.value('date'),
}).outputs({
'#list.date': '#existingDates',
}),
{
dependencies: [
input('date'),
input('override'),
'#existingDates',
],
compute: (continuation, {
[input('date')]: date,
[input('override')]: override,
'#existingDates': existingDates,
}) => continuation({
['#assignmentMap']:
// TODO: Should be mapping over withIndicesFromList
(_, index) =>
(!override && existingDates[index]
? {date: existingDates[index]}
: date
? {date}
: {}),
}),
},
withMappedList({
list: input('list'),
map: '#assignmentMap',
}).outputs({
'#mappedList': '#assignment',
}),
withClonedThings({
things: input('list'),
assignEach: '#assignment',
}).outputs({
'#clonedThings': '#newContributions',
}),
{
dependencies: [
input.staticDependency('list'),
'#newContributions',
],
compute: (continuation, {
[input.staticDependency('list')]: listDependency,
['#newContributions']: newContributions,
}) => continuation({
[listDependency]:
newContributions,
}),
},
],
});
|