infra
/
goutils
Archived
1
0
Fork 0
This repository has been archived on 2022-04-06. You can view files and clone it, but cannot push or open issues or pull requests.
goutils/buf/bytes_queue.go

42 lines
715 B
Go
Raw Normal View History

2018-06-06 15:30:23 +09:00
package buf
import (
"container/list"
)
func NewBytesQueue() (chan<- []byte, <-chan []byte) {
send := make(chan []byte, 1)
receive := make(chan []byte, 1)
go manageBytesQueue(send, receive)
return send, receive
}
func manageBytesQueue(send <-chan []byte, receive chan<- []byte) {
queue := list.New()
for {
if front := queue.Front(); front == nil {
if send == nil {
close(receive)
return
}
value, ok := <-send
if !ok {
close(receive)
return
}
queue.PushBack(value)
} else {
select {
case receive <- front.Value.([]byte):
queue.Remove(front)
case value, ok := <-send:
if ok {
queue.PushBack(value)
} else {
send = nil
}
}
}
}
}