Skip to content

Proposal: (Period[T]) Periodic and similar methods returns iter.Seq[Time[T]] instead of channel #34

@nobishino

Description

@nobishino

golang/go#61897 がacceptedになりました。

これに伴い、コレクションを返すAPIではiter.Seqを返すことがおそらく一般的になっていくと思います。
例えばGo標準ライブラリのproposal golang/go#53987 (comment) は、最終的にiter.Seqを返すAPIとしてacceptされました。

同様に、synchroでコレクションを返すAPIをiter.Seqに対応させるプランはあるでしょうか?(もしあれば、実装することに興味があります)

具体的には以下のようなものです。
細かいところが十分考えられていないのですが、少し見ていただいた印象としてもしポジティブであればより具体的に考えたいと思っています。

Proposal

synchroではコレクションを返すメソッドとしてPeriod[T]などがunexportedな型periodical[T]を返しており、これの実体は<-chan Time[T]になっていると思います。これの代わりに、iter.Seqを返すようにするというProposalです。

func (Period[T]) Periodic() iter.Seq[Time[T]]

Edit: 最初aliasを使う形で書いていたのですが、言語仕様上できないことに気づき、修正しました。

メリット

実は具体的なユースケースが手元にあるわけではなく、これを提供することで大きいメリットがあるかどうかはわかっていません。

互換性などについてのノート

nobishino@1fd8814 でテストを書きましたが、少なくとも一部で後方互換性がありません。

  • もともとはperiodical型がchannelなので、channel型の変数に代入できるという性質(テストのProperty 1)があった。periodicalの型定義をiter.Seqに置き換えると、この代入はできなくなる。
  • もともとperiodical型がchannelなので、for ~ range文で直接使うこともできた(テストのProperty 2)。この性質はrange over funcが実装された後のGoバージョンでは維持される。
  • Sliceメソッドを削除する必要が生じる。
    • Sliceメソッドを定義できるようにtype periodical[T TimeZone] iter.Seq[Time[T]]を戻り値とした場合、戻り値の値をiter.Seq[Time[T]]型の変数(関数の引数も含む)にそのままでは代入できなくなる。(型変換をすればできると思われる)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions