module Event: sig end
このモジュールはチャネルを経由したスレッド間同期通信を実現します。 John Reppy の Concurrent ML システムのように、コミュニケーションのイベントはファーストクラスの値です。イベントはコミュニケーションのために提供される前に独立に構築され結合されます。
type 'a
channel
'a
の値を運ぶ通信チャンネルの型です。val new_channel : unit -> 'a channel
type 'a
event
'a
を返す通信イベントの型です。val send : 'a channel -> 'a -> unit event
send ch v
はチャンネル ch
を通して値 v
を送るというイベントを返します。そのイベントの結果の値は ()
です。val receive : 'a channel -> 'a event
receive ch
はチャンネル ch
から値を受信するというイベントを返します。そのイベントの結果の値は受け取った値です。val always : 'a -> 'a event
always v
は同期の準備ができたというイベントを返します。イベントの値は v
です。val choose : 'a event list -> 'a event
choose evl
はリスト evl
の全てのイベントの中からひとつ選んだイベントを返します。val wrap : 'a event -> ('a -> 'b) -> 'b event
wrap ev fn
は ev
と同じコミュニケーションのように振舞うイベントを返し、そのあとで関数 fn
をその返り値に適用します。val wrap_abort : 'a event -> (unit -> unit) -> 'a event
wrap_abort ev fn
は ev
と同じコミュニケーションのように振舞うイベントを返しますが、もし選択されなければ関数 fn
が同期のあとで呼ばれます。val guard : (unit -> 'a event) -> 'a event
guard fn
は同期しているときは fn()
を計算しその結果のイベントとして振舞うイベントを返します。これは同期命令の時の副作用としてイベントを計算させることも可能です。val sync : 'a event -> 'a
val select : 'a event list -> 'a
select evl
は sync(choose evl)
と同じです。val poll : 'a event -> 'a option
Event.sync
です。イベントで指定されたすべての外部世界への可能な通信を行い、それが直ちに行えれば行って Some r
を返します。ここで r
はその通信の返り値です。直ちには行えない場合はブロックせずに None
を返します。