Channel with sliding window buffer?

Are there any versions of julia channels that do not block when they are full?
I’m looking for a channel that will do a sliding window (so drop the front of the queue when adding something to the back if it’s full). Does that exist? (I tried looking at juliapackages and here on discord and didn’t find anything)

This is a basic idea of how i could imagine using it:

> c = SlidingWindowChannel(1) # 1 = size of buffer
> put!(c, 1)
> put!(c, 2) # doesn't block
> take!(c)
2
> take!(c) # blocks because buffer has length 1 and it was emptied earlier

If it doesn’t exist, how would I implement it?

import Base.take!, Base.put!

struct SlidingWindowChannel
  c::Channel
end

function SlidingWindowChannel(size::Int=1)
  if size < 1 
    error("SlidingWindowChannel needs to have a buffer of at least 1, got $size.")
  end
  SlidingWindowChannel(Channel(size))
end

Base.take!(swc::SlidingWindowChannel) = Base.take!(swc.c)

function Base.put!(swc::SlidingWindowChannel, v::Any) 
  # from: https://discourse.julialang.org/t/function-to-check-if-channel-is-full/44795
  if length(swc.c.data) >= swc.c.sz_max
    Base.take!(swc)
  end
  Base.put!(swc.c, v)
end

Is that it? I don’t think the put! function is thread safe.