Skip to content

Commit ca735ce

Browse files
committed
add: Go 1.23 iterator support
1 parent 9172159 commit ca735ce

File tree

1 file changed

+30
-5
lines changed

1 file changed

+30
-5
lines changed

scanner.go

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package zbar
22

33
import (
4+
"bytes"
45
"errors"
56
"image"
67
"io"
8+
"iter"
79
"runtime"
810

911
"github.com/tetratelabs/wazero"
@@ -39,7 +41,6 @@ func NewScanner() *Scanner {
3941
}
4042

4143
func NewScannerWithConfig(cfg map[SymbolType][]ScannerConfig) (*Scanner, error) {
42-
4344
rt, zbar := newZbarInstance()
4445

4546
res := must(zbar.ExportedFunction("ImageScanner_create").
@@ -70,7 +71,6 @@ func NewScannerWithConfig(cfg map[SymbolType][]ScannerConfig) (*Scanner, error)
7071
func (s *Scanner) SetConfig(t SymbolType, cfg ScannerConfig) error {
7172
res, err := s.mod.ExportedFunction("ImageScanner_set_config").
7273
Call(ctx, uint64(s.scanner), uint64(t), uint64(cfg.Config), uint64(cfg.Value))
73-
7474
if err != nil {
7575
return err
7676
}
@@ -102,7 +102,6 @@ func (s *Scanner) ReadAll(img image.Image) ([][]byte, error) {
102102
Call(ctx, uint64(zbarImg.ptr))
103103

104104
return data, nil
105-
106105
}
107106

108107
func (s *Scanner) Reader(img image.Image) (*Reader, error) {
@@ -124,7 +123,6 @@ func (s *Scanner) Reader(img image.Image) (*Reader, error) {
124123
mod: s.mod,
125124
img: zbarImg,
126125
}, nil
127-
128126
}
129127

130128
func (s *Scanner) scan(i img) error {
@@ -142,7 +140,6 @@ func (s *Scanner) scan(i img) error {
142140
}
143141

144142
func (s *Scanner) createImage(i image.Image) img {
145-
146143
bounds := i.Bounds()
147144

148145
buf := s.malloc(uint32(bounds.Dx() * bounds.Dy()))
@@ -264,3 +261,31 @@ func (r *Reader) Close() error {
264261
r.img.ptr = 0
265262
return nil
266263
}
264+
265+
// Iter returns a go 1.23 iterator reusing
266+
// a single buffer for all symbols.
267+
func (r *Reader) Iter() iter.Seq2[[]byte, error] {
268+
var (
269+
// default io.Copy buffer size
270+
copyBuf = make([]byte, 32*1024)
271+
buf = bytes.Buffer{}
272+
)
273+
274+
return func(yield func([]byte, error) bool) {
275+
defer r.Close()
276+
277+
for {
278+
_, err := io.CopyBuffer(&buf, r, copyBuf)
279+
if err != nil {
280+
yield(nil, err)
281+
return
282+
}
283+
284+
if !yield(buf.Bytes(), nil) || !r.Next() {
285+
return
286+
}
287+
288+
buf.Reset()
289+
}
290+
}
291+
}

0 commit comments

Comments
 (0)