1
0
Fork 0
kifflom/buffer/buffer.go

53 lines
782 B
Go
Raw Permalink Normal View History

2015-02-26 16:31:31 +00:00
// Buffer is responsible for reading bytes from input, decode runes
// and stream those to the lexer
2015-02-23 13:07:19 +00:00
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() {
2015-02-23 13:09:36 +00:00
defer close(b.ready)
2015-02-23 13:07:19 +00:00
for {
2015-02-23 13:09:36 +00:00
if r, _, err := b.input.ReadRune(); err == nil {
2015-02-23 13:07:19 +00:00
b.ready <- r
2015-02-23 13:09:36 +00:00
} else {
return
2015-02-23 13:07:19 +00:00
}
}
}