oUqE2
1
mutable
struct
RingBuffer
{
T
}
buffers
::
Channel
{
T
}
results
::
Channel
{
T
}
current
::
T
end
function
RingBuffer
(
bufs
::
Vector
{
T
}
)
where
T
size
=
length
(
bufs
)
-
1
buffers
=
Channel
{
T
}
(
size
+
1
)
results
=
Channel
{
T
}
(
size
)
foreach
(
bufs
[
2
:
end
]
)
do
buf
put!
(
buffers
,
buf
)
end
return
RingBuffer
{
T
}
(
buffers
,
results
,
bufs
[
1
]
)
end
function
RingBuffer
(
size
,
buffer
::
T
)
where
T
buffers
=
[
buffer
]
for
i
∈
1
:
size
push!
(
buffers
,
deepcopy
(
buffer
)
)
end
return
RingBuffer
(
buffers
)
end
function
Base
.
take!
(
ringbuffer
::
RingBuffer
)
put!
(
ringbuffer
.
buffers
,
ringbuffer
.
current
)
ringbuffer
.
current
=
take!
(
ringbuffer
.
results
)
return
ringbuffer
.
current
end
function
Base
.
put!
(
f!
,
ringbuffer
::
RingBuffer
)
buf
=
take!
(
ringbuffer
.
buffers
)
buf_
=
f!
(
buf
)
#@assert buf_ === buf
put!
(
ringbuffer
.
results
,
buf_
)
end
function
Base
.
close
(
ringbuffer
::
RingBuffer
)
close
(
ringbuffer
.
results
)
close
(
ringbuffer
.
buffers
)
end