« get me outta code hell

contracts: highly dysfunctional ContractManager - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/content/dependencies/generateAlbumTrackList.js
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2023-05-07 17:03:00 -0300
committer(quasar) nebula <qznebula@protonmail.com>2023-05-07 17:03:00 -0300
commit63b1b5b6fd14d3bacdcb979298b4fa669de4f20b (patch)
tree224ee910247a3b2ca3336e97c52101daf36866bb /src/content/dependencies/generateAlbumTrackList.js
parent4280c6240b88dadc8e5ea187b78c10aca9dfc163 (diff)
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.)
Diffstat (limited to 'src/content/dependencies/generateAlbumTrackList.js')
-rw-r--r--src/content/dependencies/generateAlbumTrackList.js103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/content/dependencies/generateAlbumTrackList.js b/src/content/dependencies/generateAlbumTrackList.js
index f2f2279..a0fad46 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 = {};