aboutsummaryrefslogtreecommitdiff
path: root/object/store/mix/new.go
diff options
context:
space:
mode:
Diffstat (limited to 'object/store/mix/new.go')
-rw-r--r--object/store/mix/new.go39
1 files changed, 39 insertions, 0 deletions
diff --git a/object/store/mix/new.go b/object/store/mix/new.go
new file mode 100644
index 00000000..bb39178c
--- /dev/null
+++ b/object/store/mix/new.go
@@ -0,0 +1,39 @@
+package mix
+
+import "codeberg.org/lindenii/furgit/object/store"
+
+// New creates a Mix from backends.
+//
+// The provided backends must be non-nil and distinct.
+// Mix borrows the provided backends and does not close them in Close.
+func New(backends ...objectstore.Store) *Mix {
+ nodeByStore := make(map[objectstore.Store]*backendNode, len(backends))
+
+ var (
+ head *backendNode
+ tail *backendNode
+ )
+
+ for _, backend := range backends {
+ node := &backendNode{
+ backend: backend,
+ prev: tail,
+ }
+ if tail != nil {
+ tail.next = node
+ }
+
+ if head == nil {
+ head = node
+ }
+
+ tail = node
+ nodeByStore[backend] = node
+ }
+
+ return &Mix{
+ backendHead: head,
+ backendTail: tail,
+ backendNodeByStore: nodeByStore,
+ }
+}