aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2024-12-20 19:05:39 +0900
committerOphestra <cat@gensokyo.uk>2024-12-20 19:05:39 +0900
commited10574deacf5a27be9572a94c1ae2e39e11ff6c (patch)
treec4742038f427e340482763e426c784e2418efa7b
parent195b717e01ede09cc6fc608ecf72855b49316687 (diff)
state: store join util
Signed-off-by: Ophestra <cat@gensokyo.uk>
-rw-r--r--internal/state/state_test.go8
-rw-r--r--internal/state/util.go49
2 files changed, 57 insertions, 0 deletions
diff --git a/internal/state/state_test.go b/internal/state/state_test.go
index 9af438e1..b19c64b5 100644
--- a/internal/state/state_test.go
+++ b/internal/state/state_test.go
@@ -94,6 +94,14 @@ func testStore(t *testing.T, s state.Store) {
}
})
+ t.Run("join store", func(t *testing.T) {
+ if entries, err := state.Join(s); err != nil {
+ t.Fatalf("Join: error = %v", err)
+ } else if len(entries) != 3 {
+ t.Fatalf("Join(s) = %#v", entries)
+ }
+ })
+
t.Run("clear aid 1", func(t *testing.T) {
do(1, func(c state.Cursor) {
if err := c.Destroy(tc[insertEntryOtherApp].ID); err != nil {
diff --git a/internal/state/util.go b/internal/state/util.go
new file mode 100644
index 00000000..473ae51d
--- /dev/null
+++ b/internal/state/util.go
@@ -0,0 +1,49 @@
+package state
+
+import (
+ "errors"
+ "maps"
+)
+
+var (
+ ErrDuplicate = errors.New("store contains duplicates")
+)
+
+// Join returns joined state entries of all active aids.
+func Join(s Store) (Entries, error) {
+ var (
+ aids []int
+ entries = make(Entries)
+
+ el int
+ res Entries
+ loadErr error
+ )
+
+ if ln, err := s.List(); err != nil {
+ return nil, err
+ } else {
+ aids = ln
+ }
+
+ for _, aid := range aids {
+ if _, err := s.Do(aid, func(c Cursor) {
+ res, loadErr = c.Load()
+ }); err != nil {
+ return nil, err
+ }
+
+ if loadErr != nil {
+ return nil, loadErr
+ }
+
+ // save expected length
+ el = len(entries) + len(res)
+ maps.Copy(entries, res)
+ if len(entries) != el {
+ return nil, ErrDuplicate
+ }
+ }
+
+ return entries, nil
+}