From 63b1b5b6fd14d3bacdcb979298b4fa669de4f20b Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Sun, 7 May 2023 17:03:00 -0300 Subject: contracts: highly dysfunctional ContractManager Also some setup in generateAlbumTrackList in particular. None of this works yet! Probably replacing most everything in ContractManager, just putting this in a commit so it's logged. (All written a few days ago.) --- src/content/dependencies/generateAlbumTrackList.js | 103 +++++++++++++++++++++ 1 file changed, 103 insertions(+) (limited to 'src/content/dependencies/generateAlbumTrackList.js') diff --git a/src/content/dependencies/generateAlbumTrackList.js b/src/content/dependencies/generateAlbumTrackList.js index f2f2279d..a0fad460 100644 --- a/src/content/dependencies/generateAlbumTrackList.js +++ b/src/content/dependencies/generateAlbumTrackList.js @@ -44,6 +44,109 @@ export default { 'language', ], + contracts: { + length: { + hook(contract, [array]) { + contract.provide({ + length: contract.selectProperty(array, 'length'), + }); + }, + + compute({length}) { + return length; + }, + }, + + isDefault: { + hook(contract, [trackSection]) { + contract.provide({ + isDefault: contract.selectProperty(trackSection, 'isDefaultTrackSection', false), + }); + }, + + compute({isDefault}) { + return isDefault; + }, + }, + + firstIsDefault: { + hook(contract, [trackSections]) { + contract.provide({ + isDefault: contract.subcontract('#isDefault', contract.selectProperty(trackSections, '0')), + }); + }, + + compute({isDefault}) { + return isDefault; + }, + }, + + displayTrackSections: { + hook(contract, [album]) { + contract.provide({ + numTrackSections: contract.subcontract('#length', contract.selectProperty(album, 'trackSections')), + firstIsDefault: contract.subcontract('#firstIsDefault', contract.selectProperty(album, 'trackSections')), + }); + }, + + compute({numTrackSections, firstIsDefault}) { + return numTrackSections >= 2 || firstIsDefault; + }, + }, + + displayTracks: { + hook(contract, [album]) { + contract.provide({ + numTracks: contract.subcontract('#length', contract.selectProperty(album, 'tracks')), + }); + }, + + compute({numTracks}) { + return numTracks >= 1; + }, + }, + + displayMode: { + hook(contract, [album]) { + contract.provide({ + displayTrackSections: contract.subcontract('#displayTrackSections', album), + displayTracks: contract.subcontract('#displayTracks', album), + }); + }, + + compute({displayTrackSections, displayTracks}) { + if (displayTrackSections) { + return 'trackSections'; + } else if (displayTracks) { + return 'tracks'; + } else { + return 'none'; + } + }, + }, + + relations: { + hook(contract, [relation, album]) { + contract.branch({ + subcontract: ['#displayMode', album], + branches: { + trackSections() { + contract.provide({ + trackSections: contract.selectProperty(album, 'trackSections'), + }); + }, + + tracks() { + contract.provide({ + tracks: contract.selectProperty(album, 'tracks'), + }); + }, + }, + }); + }, + }, + }, + relations(relation, album) { const relations = {}; -- cgit 1.3.0-6-gf8a5