1
0
Fork 0
kifflom/buffer/buffer.go

53 lines
782 B
Go

// Buffer is responsible for reading bytes from input, decode runes
// and stream those to the lexer
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() {
defer close(b.ready)
for {
if r, _, err := b.input.ReadRune(); err == nil {
b.ready <- r
} else {
return
}
}
}