From 450526565e92a5c914268bfcc653a95b44752393 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Wed, 16 Apr 2025 18:10:39 -0300 Subject: data: Artwork.{isMainArtwork,mainArtwork,siblingArtworks} --- src/data/composite/things/artwork/index.js | 1 + .../things/artwork/withContainingArtworkList.js | 46 +++++++++++++++ src/data/things/artwork.js | 68 +++++++++++++++++++++- 3 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 src/data/composite/things/artwork/withContainingArtworkList.js diff --git a/src/data/composite/things/artwork/index.js b/src/data/composite/things/artwork/index.js index b92bff72..e2661b50 100644 --- a/src/data/composite/things/artwork/index.js +++ b/src/data/composite/things/artwork/index.js @@ -1 +1,2 @@ +export {default as withContainingArtworkList} from './withContainingArtworkList.js'; export {default as withDate} from './withDate.js'; diff --git a/src/data/composite/things/artwork/withContainingArtworkList.js b/src/data/composite/things/artwork/withContainingArtworkList.js new file mode 100644 index 00000000..9c928ffd --- /dev/null +++ b/src/data/composite/things/artwork/withContainingArtworkList.js @@ -0,0 +1,46 @@ +// Gets the list of artworks which contains this one, which is functionally +// equivalent to `this.thing[this.thingProperty]`. If the exposed value is not +// a list at all (i.e. the property holds a single artwork), this composition +// outputs null. + +import {input, templateCompositeFrom} from '#composite'; + +import {raiseOutputWithoutDependency} from '#composite/control-flow'; +import {withPropertyFromObject} from '#composite/data'; + +export default templateCompositeFrom({ + annotation: `withContainingArtworkList`, + + outputs: ['#containingArtworkList'], + + steps: () => [ + raiseOutputWithoutDependency({ + dependency: 'thing', + output: input.value({'#containingArtworkList': null}), + }), + + raiseOutputWithoutDependency({ + dependency: 'thingProperty', + output: input.value({'#containingArtworkList': null}), + }), + + withPropertyFromObject({ + object: 'thing', + property: 'thingProperty', + }).outputs({ + '#value': '#containingValue', + }), + + { + dependencies: ['#containingValue'], + compute: (continuation, { + ['#containingValue']: containingValue, + }) => continuation({ + ['#containingArtworkList']: + (Array.isArray(containingValue) + ? containingValue + : null), + }), + }, + ], +}); diff --git a/src/data/things/artwork.js b/src/data/things/artwork.js index 197cd5d4..0ef257fe 100644 --- a/src/data/things/artwork.js +++ b/src/data/things/artwork.js @@ -24,7 +24,7 @@ import { parseDimensions, } from '#yaml'; -import {withPropertyFromObject} from '#composite/data'; +import {withIndexInList, withPropertyFromObject} from '#composite/data'; import { exitWithoutDependency, @@ -52,7 +52,7 @@ import { wikiData, } from '#composite/wiki-properties'; -import {withDate} from '#composite/things/artwork'; +import {withContainingArtworkList, withDate} from '#composite/things/artwork'; export class Artwork extends Thing { static [Thing.referenceType] = 'artwork'; @@ -303,6 +303,70 @@ export class Artwork extends Thing { referencedByArtworks: reverseReferenceList({ reverse: soupyReverse.input('artworksWhichReference'), }), + + isMainArtwork: [ + withContainingArtworkList(), + + exitWithoutDependency({ + dependency: '#containingArtworkList', + value: input.value(null), + }), + + { + dependencies: [input.myself(), '#containingArtworkList'], + compute: ({ + [input.myself()]: myself, + ['#containingArtworkList']: list, + }) => + list[0] === myself, + }, + ], + + mainArtwork: [ + withContainingArtworkList(), + + exitWithoutDependency({ + dependency: '#containingArtworkList', + value: input.value(null), + }), + + { + dependencies: ['#containingArtworkList'], + compute: ({'#containingArtworkList': list}) => + list[0], + }, + ], + + siblingArtworks: [ + withContainingArtworkList(), + + exitWithoutDependency({ + dependency: '#containingArtworkList', + value: input.value(null), + }), + + withIndexInList({ + list: '#containingArtworkList', + item: input.myself(), + }), + + exitWithoutDependency({ + dependency: '#index', + mode: input.value('index'), + value: input.value(null), + }), + + { + dependencies: ['#containingArtworkList', '#index'], + compute: ({ + ['#containingArtworkList']: list, + ['#index']: index, + }) => [ + ...list.slice(0, index), + ...list.slice(index + 1), + ], + }, + ], }); static [Thing.yamlDocumentSpec] = { -- cgit 1.3.0-6-gf8a5