One buffer fits all

This commit is contained in:
2015-02-23 20:07:19 +07:00
parent 75ff8bf4d5
commit fc170098e9
8 changed files with 70 additions and 85 deletions
+50
View File
@@ -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
}
}
}
-7
View File
@@ -1,7 +0,0 @@
package buffer
type (
Bufferer interface {
Next() rune
}
)
-34
View File
@@ -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
}
-37
View File
@@ -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
}