aboutsummaryrefslogtreecommitdiff
path: root/mergebase/seq.go
diff options
context:
space:
mode:
Diffstat (limited to 'mergebase/seq.go')
-rw-r--r--mergebase/seq.go47
1 files changed, 47 insertions, 0 deletions
diff --git a/mergebase/seq.go b/mergebase/seq.go
new file mode 100644
index 00000000..e7891737
--- /dev/null
+++ b/mergebase/seq.go
@@ -0,0 +1,47 @@
+package mergebase
+
+import (
+ "errors"
+ "iter"
+
+ "codeberg.org/lindenii/furgit/objectid"
+)
+
+// Seq returns the merge-base sequence. It is single-use.
+func (query *Bases) Seq() iter.Seq[objectid.ObjectID] {
+ if query.seqUsed {
+ return func(yield func(objectid.ObjectID) bool) {
+ _ = yield
+
+ if query.err == nil {
+ query.err = errors.New("mergebase: sequence already consumed")
+ }
+ }
+ }
+
+ query.seqUsed = true
+
+ return func(yield func(objectid.ObjectID) bool) {
+ if query.err != nil {
+ return
+ }
+
+ bases, err := query.compute()
+ if err != nil {
+ query.err = err
+
+ return
+ }
+
+ for _, id := range bases {
+ if !yield(id) {
+ return
+ }
+ }
+ }
+}
+
+// Err returns the terminal error, if any, once Seq has been consumed.
+func (query *Bases) Err() error {
+ return query.err
+}