Skip to content

Buffered-sink-type ​

BufferedSink[S] is the public buffering sink type used for threshold-based synchronous batching over another sink. It is the concrete sink type returned by buffered_sink(...) and preserves the wrapped sink type in its type parameter.

Interface ​

moonbit
pub struct BufferedSink[S] {
  sink : S
  buffer : Ref[Array[Record]]
  flush_limit : Int
}

output ​

  • BufferedSink[S] - Public synchronous sink type that buffers records before forwarding them to the wrapped sink.

Explanation ​

Detailed rules explaining key parameters and behaviors

  • This is a public root struct, not a type alias.
  • The current fields are sink : S, buffer : Ref[Array[Record]], and flush_limit : Int.
  • buffered_sink(...) constructs this type directly from a wrapped sink and flush threshold.
  • The sink preserves the wrapped sink type S, which is useful when typed composition still matters after buffering is introduced.

How to Use ​

Here are some specific examples provided.

When Need A Typed Buffered Sink Value ​

When code should keep the concrete buffering sink type visible:

moonbit
let sink : BufferedSink[ConsoleSink] = buffered_sink(console_sink(), flush_limit=2)

In this example, the sink value stays explicit and preserves the wrapped console sink type.

When Need A Typed Logger With Synchronous Batching ​

When logging should preserve the buffering sink type in the logger:

moonbit
let logger : Logger[BufferedSink[ConsoleSink]] = Logger::new(
  buffered_sink(console_sink(), flush_limit=2),
  target="buffered",
)

In this example, the concrete buffered sink remains part of the logger type.

Error Case ​

e.g.:

  • BufferedSink[S] itself does not have a runtime failure mode.

  • Runtime behavior still depends on the wrapped sink S, and buffered records can remain pending if flushing never happens.

Notes ​

  1. Use buffered_sink(...) when you need a value of this type.

  2. Use QueuedSink[S] when overflow-aware queueing behavior is needed instead of simple buffering.

Published from the repository docs folder with VitePress.