One buffer fits all
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
package buffer
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"io"
|
||||
)
|
||||
|
||||
type (
|
||||
Buffer struct {
|
||||
input *bufio.Reader
|
||||
ready chan rune
|
||||
}
|
||||
)
|
||||
|
||||
func NewBytesBuffer(b []byte) *Buffer {
|
||||
return NewReaderBuffer(bytes.NewReader(b))
|
||||
}
|
||||
|
||||
func NewReaderBuffer(rd io.Reader) *Buffer {
|
||||
return New(bufio.NewReader(rd))
|
||||
}
|
||||
|
||||
func New(input *bufio.Reader) *Buffer {
|
||||
b := &Buffer{
|
||||
input: input,
|
||||
ready: make(chan rune, 100),
|
||||
}
|
||||
go b.stream()
|
||||
return b
|
||||
}
|
||||
|
||||
func (b *Buffer) Next() rune {
|
||||
if next, ok := <-b.ready; ok {
|
||||
return next
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
func (b *Buffer) stream() {
|
||||
for {
|
||||
if r, _, err := b.input.ReadRune(); err != nil {
|
||||
close(b.ready)
|
||||
break
|
||||
} else {
|
||||
b.ready <- r
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
package buffer
|
||||
|
||||
type (
|
||||
Bufferer interface {
|
||||
Next() rune
|
||||
}
|
||||
)
|
||||
@@ -1,34 +0,0 @@
|
||||
package buffer
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"unicode/utf8"
|
||||
)
|
||||
|
||||
type (
|
||||
BytesBuffer struct {
|
||||
input []byte
|
||||
size uint64
|
||||
pos uint64
|
||||
}
|
||||
)
|
||||
|
||||
func NewBytesBuffer(input []byte) *BytesBuffer {
|
||||
return &BytesBuffer{
|
||||
input: input,
|
||||
size: uint64(len(input)),
|
||||
}
|
||||
}
|
||||
|
||||
func (b *BytesBuffer) Next() rune {
|
||||
var buf bytes.Buffer
|
||||
for b.pos < b.size {
|
||||
buf.WriteByte(b.input[b.pos])
|
||||
b.pos++
|
||||
if ok := utf8.FullRune(buf.Bytes()); ok {
|
||||
r, _ := utf8.DecodeRune(buf.Bytes())
|
||||
return r
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
package buffer
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"unicode/utf8"
|
||||
)
|
||||
|
||||
type (
|
||||
StreamBuffer struct {
|
||||
input io.Reader
|
||||
}
|
||||
)
|
||||
|
||||
func NewStreamBuffer(input io.Reader) *StreamBuffer {
|
||||
return &StreamBuffer{
|
||||
input: input,
|
||||
}
|
||||
}
|
||||
|
||||
func (b *StreamBuffer) Next() rune {
|
||||
var (
|
||||
buf bytes.Buffer
|
||||
)
|
||||
for {
|
||||
rbuf := make([]byte, 1)
|
||||
if n, err := b.input.Read(rbuf); n != 1 || err != nil {
|
||||
return 0
|
||||
}
|
||||
buf.Write(rbuf)
|
||||
if ok := utf8.FullRune(buf.Bytes()); ok {
|
||||
r, _ := utf8.DecodeRune(buf.Bytes())
|
||||
return r
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
Reference in New Issue
Block a user