mirror of
https://github.com/syncthing/syncthing.git
synced 2025-12-23 22:18:14 -05:00
Switch the database from LevelDB to SQLite, for greater stability and simpler code. Co-authored-by: Tommy van der Vorst <tommy@pixelspark.nl> Co-authored-by: bt90 <btom1990@googlemail.com>
84 lines
2.0 KiB
Go
84 lines
2.0 KiB
Go
// Copyright (C) 2025 The Syncthing Authors.
|
|
//
|
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
// You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
|
|
package itererr
|
|
|
|
import "iter"
|
|
|
|
// Collect returns a slice of the items from the iterator, plus the error if
|
|
// any.
|
|
func Collect[T any](it iter.Seq[T], errFn func() error) ([]T, error) {
|
|
var s []T
|
|
for v := range it {
|
|
s = append(s, v)
|
|
}
|
|
return s, errFn()
|
|
}
|
|
|
|
// Zip interleaves the iterator value with the error. The iteration ends
|
|
// after a non-nil error.
|
|
func Zip[T any](it iter.Seq[T], errFn func() error) iter.Seq2[T, error] {
|
|
return func(yield func(T, error) bool) {
|
|
for v := range it {
|
|
if !yield(v, nil) {
|
|
break
|
|
}
|
|
}
|
|
if err := errFn(); err != nil {
|
|
var zero T
|
|
yield(zero, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Map returns a new iterator by applying the map function, while respecting
|
|
// the error function. Additionally, the map function can return an error if
|
|
// its own.
|
|
func Map[A, B any](i iter.Seq[A], errFn func() error, mapFn func(A) (B, error)) (iter.Seq[B], func() error) {
|
|
var retErr error
|
|
return func(yield func(B) bool) {
|
|
for v := range i {
|
|
mapped, err := mapFn(v)
|
|
if err != nil {
|
|
retErr = err
|
|
return
|
|
}
|
|
if !yield(mapped) {
|
|
return
|
|
}
|
|
}
|
|
}, func() error {
|
|
if prevErr := errFn(); prevErr != nil {
|
|
return prevErr
|
|
}
|
|
return retErr
|
|
}
|
|
}
|
|
|
|
// Map returns a new iterator by applying the map function, while respecting
|
|
// the error function. Additionally, the map function can return an error if
|
|
// its own.
|
|
func Map2[A, B, C any](i iter.Seq[A], errFn func() error, mapFn func(A) (B, C, error)) (iter.Seq2[B, C], func() error) {
|
|
var retErr error
|
|
return func(yield func(B, C) bool) {
|
|
for v := range i {
|
|
ma, mb, err := mapFn(v)
|
|
if err != nil {
|
|
retErr = err
|
|
return
|
|
}
|
|
if !yield(ma, mb) {
|
|
return
|
|
}
|
|
}
|
|
}, func() error {
|
|
if prevErr := errFn(); prevErr != nil {
|
|
return prevErr
|
|
}
|
|
return retErr
|
|
}
|
|
}
|