Next: thread.future, Previous: thread.channel, Up: Top [Contents]
%--------------------------------------------------%
% vim: ft=mercury ts=4 sw=4 et
%--------------------------------------------------%
% Copyright (C) 2020 The Mercury team.
% This file is distributed under the terms specified in COPYING.LIB.
%--------------------------------------------------%
%
% File: thread.closeable_channel.m.
% Main author: wangp.
% Stability: low.
%
% Unbounded closeable channels.
%
%--------------------------------------------------%
%--------------------------------------------------%
:- module thread.closeable_channel.
:- interface.
:- import_module bool.
:- import_module io.
%--------------------------------------------------%
:- type closeable_channel(T).
% Initialise a channel.
%
:- pred init(closeable_channel(T)::out, io::di, io::uo) is det.
% Put an item at the end of the channel.
% Returns `yes' if successful, or `no' if the channel is closed.
%
:- pred put(closeable_channel(T)::in, T::in, bool::out, io::di, io::uo)
is det.
% Close a channel. Once a channel is closed, no more items can be added
% to it. Closing a channel that is already closed has no effect.
%
:- pred close(closeable_channel(T)::in, io::di, io::uo) is det.
:- type take_result(T)
---> ok(T)
; closed.
% Take an item from the start of the channel, blocking until an item is
% available or until the channel is closed. Returns `ok(Item)' if `Item'
% was taken, or `closed' if the channel is closed.
%
:- pred take(closeable_channel(T)::in, take_result(T)::out, io::di, io::uo)
is det.
:- type try_take_result(T)
---> ok(T)
; closed
; would_block.
% Take an item from the start of the channel, but do not block.
% Returns `ok(Item)' if `Item' was taken from the channel,
% `closed' if no item was taken because the channel is closed, or
% `would_block' if no item could be taken from the channel without
% blocking. `would_block' may be returned even if the channel is not
% empty.
%
:- pred try_take(closeable_channel(T)::in, try_take_result(T)::out,
io::di, io::uo) is det.
%--------------------------------------------------%
%--------------------------------------------------%