anchor.diff:          length <- length - count
           dequeued
   
  -    member this.Enqueue(value) =
  +    member __.Enqueue(value: _[], offset, count) =
  +        let mutable offset = offset
  +
  +        // NOTE: We could save a lot by just pulling the last
  +        // bufferSize elements, but we'll be converting to a
  +        // blocking agent eventually.
           head <- (head + 1) % bufferSize
  -        buffer.[head] <- value
  +        for x, y in nextBuffer head count do
  +            Array.blit value offset buffer x y
  +            offset <- offset + y
  +
           if length = bufferSize then
  -            tail <- (tail + 1) % bufferSize
  +            tail <- (tail + count) % bufferSize
           else
  -            length <- length + 1
  -
  -    member this.Enqueue(value: 'a[]) =
  -        for x in value do this.Enqueue(x)
  -        // NOTE: The following works, but it typically takes longer than the iteration approach above.
  -//        let mutable offset = 0
  -//        let count = value.Length
  -//
  -//        head <- (head + 1) % bufferSize
  -//        for x, y in nextBuffer head count do
  -//            Array.blit value offset buffer x y
  -//            offset <- offset + y
  -//
  -//        if length = bufferSize then
  -//            tail <- (tail + count) % bufferSize
  -//        else
  -//            let overflow = length + count - bufferSize
  -//            if overflow > 0 then
  -//                tail <- (tail + overflow) % bufferSize
  -//            length <- min (length + count) bufferSize
  -
  +            let overflow = length + count - bufferSize
  +            if overflow > 0 then
  +                tail <- (tail + overflow) % bufferSize
  +            length <- min (length + count) bufferSize
  +
  +    member __.Enqueue(value: _[]) =
  +        __.Enqueue(value, 0, value.Length)
  +
  +    member __.Enqueue(value: _[], offset) =
  +        __.Enqueue(value, offset, value.Length - offset)
  +
  +    member __.Enqueue(value: ArraySegment<_>) =
  +        __.Enqueue(value.Array, value.Offset, value.Count)
  +
  +    member __.Enqueue(value) =
  +        __.Enqueue([|value|], 0, 1)
  +// [/snippet]
  +
  +// [snippet: Usage]
   let queue = CircularBuffer(5)
   
   let stopwatch = Stopwatch.StartNew()
  
positive.code: Debug.Assert([|1;2;3|] = queue.Dequeue(3))
  
  printfn "Enqueue(array) tests passed in %d ms" stopwatch.ElapsedMilliseconds
  
negative.code:                 yield (offset, count)
          }
  
      member __.Dequeue(count) =
          if length = 0 then invalidOp "Queue exhausted."
          if count > length then invalidOp "Requested count is too large."
  
  