« get me outta code hell

data: update Track.composite.withAlbum implementation - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2023-08-30 16:47:16 -0300
committer(quasar) nebula <qznebula@protonmail.com>2023-09-05 21:02:54 -0300
commitd4e5d37ef9bc09789715f978e1b636bc2a1f8e97 (patch)
tree57b02651233fa57fd14ec92c8320695628d7c60e /src
parentc98a1a5faa40bfad79bc3b07aa8e9d53111b10a7 (diff)
data: update Track.composite.withAlbum implementation
Diffstat (limited to 'src')
-rw-r--r--src/data/things/track.js84
1 files changed, 52 insertions, 32 deletions
diff --git a/src/data/things/track.js b/src/data/things/track.js
index 724c860..2204368 100644
--- a/src/data/things/track.js
+++ b/src/data/things/track.js
@@ -393,41 +393,61 @@ export class Track extends Thing {
     // this will early exit with null in two cases - albumData being missing,
     // or not including an album whose .tracks array includes this track.
     withAlbum({to = '#album', earlyExitIfNotFound = true} = {}) {
-      return {
-        annotation: `Track.composite.withAlbum`,
-        flags: {expose: true, compose: true},
+      return Thing.composite.from(`Track.composite.withAlbum`, [
+        Thing.composite.withResultOfAvailabilityCheck({
+          fromDependency: 'albumData',
+          mode: 'empty',
+          to: '#albumDataAvailability',
+        }),
 
-        expose: {
-          dependencies: ['this', 'albumData'],
-          mapContinuation: {to},
-          options: {earlyExitIfNotFound},
-
-          compute({
-            this: track,
-            albumData,
-            '#options': {earlyExitIfNotFound},
-          }, continuation) {
-            if (empty(albumData)) {
-              return (
-                (earlyExitIfNotFound
-                  ? continuation.exit(null)
-                  : continuation({to: null})));
-            }
-
-            const album =
-              albumData?.find(album => album.tracks.includes(track));
-
-            if (!album) {
-              return (
-                (earlyExitIfNotFound
-                  ? continuation.exit(null)
-                  : continuation({to: null})));
-            }
-
-            return continuation({to: album});
+        {
+          flags: {expose: true, compose: true},
+          expose: {
+            dependencies: ['#albumDataAvailability'],
+            options: {earlyExitIfNotFound},
+            mapContinuation: {to},
+            compute: ({
+              '#albumDataAvailability': albumDataAvailability,
+              '#options': {earlyExitIfNotFound},
+            }, continuation) =>
+              (albumDataAvailability
+                ? continuation()
+                : (earlyExitIfNotFound
+                    ? continuation.exit(null)
+                    : continuation.raise({to: null}))),
+          },
+        },
+
+        {
+          flags: {expose: true, compose: true},
+          expose: {
+            dependencies: ['this', 'albumData'],
+            compute: ({this: track, albumData}, continuation) =>
+              continuation({
+                '#album':
+                  albumData.find(album => album.tracks.includes(track)),
+              }),
           },
         },
-      };
+
+        {
+          flags: {expose: true, compose: true},
+          expose: {
+            dependencies: ['#album'],
+            options: {earlyExitIfNotFound},
+            mapContinuation: {to},
+            compute: ({
+              '#album': album,
+              '#options': {earlyExitIfNotFound},
+            }, continuation) =>
+              (album
+                ? continuation.raise({to: album})
+                : (earlyExitIfNotFound
+                    ? continuation.exit(null)
+                    : continuation.raise({to: album}))),
+          },
+        },
+      ]);
     },
 
     // Gets a single property from this track's album, providing it as the same