chann

package
v0.0.0-...-1ba95a4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 21, 2024 License: Apache-2.0, MIT Imports: 1 Imported by: 2

Documentation

Overview

Package chann providesa a unified channel package.

The package is compatible with existing buffered and unbuffered channels. For example, in Go, to create a buffered or unbuffered channel, one uses built-in function `make` to create a channel:

ch := make(chan int)     // unbuffered channel
ch := make(chan int, 42) // or buffered channel

However, all these channels have a finite capacity for caching, and it is impossible to create a channel with unlimited capacity, namely, an unbounded channel.

This package provides the ability to create all possible types of channels. To create an unbuffered or a buffered channel:

ch := chann.New[int](chann.Cap(0))  // unbuffered channel
ch := chann.New[int](chann.Cap(42)) // or buffered channel

More importantly, when the capacity of the channel is unspecified, or provided as negative values, the created channel is an unbounded channel:

ch := chann.New[int]()               // unbounded channel
ch := chann.New[int](chann.Cap(-42)) // or unbounded channel

Furthermore, all channels provides methods to send (In()), receive (Out()), and close (Close()).

An unbounded channel is not a buffered channel with infinite capacity, and they have different memory model semantics in terms of receiving a value: The recipient of a buffered channel is immediately available after a send is complete. However, the recipient of an unbounded channel may be available within a bounded time frame after a send is complete.

Note that to close a channel, must use Close() method instead of the language built-in method Two additional methods: ApproxLen and Cap returns the current status of the channel: an approximation of the current length of the channel, as well as the current capacity of the channel.

See https://golang.design/research/ultimate-channel to understand the motivation of providing this package and the possible use cases with this package.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Chann

type Chann[T any] struct {
	// contains filtered or unexported fields
}

Chann is a generic channel abstraction that can be either buffered, unbuffered, or unbounded. To create a new channel, use New to allocate one, and use Cap to configure the capacity of the channel.

func New

func New[T any](opts ...Opt) *Chann[T]

New returns a Chann that may represent a buffered, an unbuffered or an unbounded channel. To configure the type of the channel, one may pass Cap as the argument of this function.

By default, or without specification, the function returns an unbounded channel which has unlimited capacity.

ch := chann.New[float64]()
or
ch := chann.New[float64](chann.Cap(-1))

If the chann.Cap specified a non-negative integer, the returned channel is either unbuffered (0) or buffered (positive).

Note that although the input arguments are specified as variadic parameter list, however, the function panics if there is more than one option is provided. DEPRECATED: use NewAutoDrainChann instead.

func (*Chann[T]) Cap

func (ch *Chann[T]) Cap() int

Cap returns the capacity of the channel.

func (*Chann[T]) Close

func (ch *Chann[T]) Close()

Close closes the channel gracefully. DEPRECATED: use CloseAndDrain instead.

func (*Chann[T]) In

func (ch *Chann[T]) In() chan<- T

In returns the send channel of the given Chann, which can be used to send values to the channel. If one closes the channel using close(), it will result in a runtime panic. Instead, use Close() method.

func (*Chann[T]) Len

func (ch *Chann[T]) Len() int

Len returns an approximation of the length of the channel.

Note that in a concurrent scenario, the returned length of a channel may never be accurate. Hence the function is named with an Approx prefix.

func (*Chann[T]) Out

func (ch *Chann[T]) Out() <-chan T

Out returns the receive channel of the given Chann, which can be used to receive values from the channel.

type DrainableChann

type DrainableChann[T any] struct {
	// contains filtered or unexported fields
}

DrainableChann is a channel that will be drained when it is closed. It is a wrapper of Chann. NOTICE: Please make sure that it is safe to drain rest elements in the channel before closing the channel.

func NewAutoDrainChann

func NewAutoDrainChann[T any](opts ...Opt) *DrainableChann[T]

NewAutoDrainChann creates a new DrainableChann.

func (*DrainableChann[T]) Cap

func (ch *DrainableChann[T]) Cap() int

Cap returns the capacity of the channel.

func (*DrainableChann[T]) CloseAndDrain

func (ch *DrainableChann[T]) CloseAndDrain()

CloseAndDrain closes the channel and drains the channel to avoid the goroutine leak.

func (*DrainableChann[T]) In

func (ch *DrainableChann[T]) In() chan<- T

In returns the send channel of the given Chann, which can be used to send values to the channel. If one closes the channel using close(), it will result in a runtime panic. Instead, use CloseAndDrain() method.

func (*DrainableChann[T]) Len

func (ch *DrainableChann[T]) Len() int

Len returns an approximation of the length of the channel.

Note that in a concurrent scenario, the returned length of a channel may never be accurate. Hence the function is named with an Approx prefix.

func (*DrainableChann[T]) Out

func (ch *DrainableChann[T]) Out() <-chan T

Out returns the receive channel of the given Chann, which can be used to receive values from the channel.

type Opt

type Opt func(*config)

Opt represents an option to configure the created channel. The current possible option is Cap.

func Cap

func Cap(n int) Opt

Cap is the option to configure the capacity of a creating buffer. if the provided number is 0, Cap configures the creating buffer to a unbuffered channel; if the provided number is a positive integer, then Cap configures the creating buffer to a buffered channel with the given number of capacity for caching. If n is a negative integer, then it configures the creating channel to become an unbounded channel.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL