snapTo — 属する窓の先頭点へ写す(floor)
分類: 点変換(本体層 core) / シグネチャ: snapTo(w) : Stream -> Stream / 名は確定(RC2・spec §5.4)
意味
各点を、その点が属する w 窓の先頭点へ写す(floor)。粒度の継ぎ目を揃える演算子——
時刻つきの天文事象(節気の瞬間・朔の瞬間)を「その日」に落とす、時刻列を「その月」の初めに畳む、など。
公開境界語(monthStart = month |> first=窓→点)とは入口が違う補完関係にある——snapTo は
点→(属する窓の)点で、選択子を経由しない(ADR-30 (6) で基本語として確定)。
第二の役割(ADR-36): 出力は構成的に w の要素グリッドに整列するため、結合子 &/\ や
軸所属の整列検査(spec §4.5)への明示の整合手段を兼ねる。既に整列している点には恒等で、
整列主張の付け替えだけが起きる。
例
立春の瞬間(2/4 05:02)を暦日に落とす:
# eval: 2026-01-01..2026-03-01
@JP
sekki = [2026-01-05T17:23, 2026-01-20T10:45, 2026-02-04T05:02]
covering: 2026..2026
labels: [小寒, 大寒, 立春]
sekki |> filter(s => sekki(s) == 立春) |> snapTo(day)
#=> 2026-02-04
朔の瞬間を朔日(旧暦月の境界に使う日付)へ:
# eval: 2026-01-01..2026-02-01
@JP
newMoons = [2026-01-19T04:52]
newMoons |> snapTo(day)
#=> 2026-01-19
#~> 範囲外 2026-01-01..2026-02-01(newMoons covering 2026-01-19T04:52..2026-01-19T04:52)
落とし穴
- 21:01 の朔もその日に floor される(切り上げではない)。「翌日に繰り上げ」の規約が要るなら
snapTo(day) |> shift(+1, unit: day)と明示的に書く。 - 異なる点が同じ窓に属せば 1 点に畳まれる(ストリームは集合)。
- 非全域の窓(
edges: dropのsegmentBy窓など、穴のある窓列)では、点がどの窓にも属さないことが ありうる。挙動は範囲外出自の三分岐(ADR-37): 点が窓データの実効被覆域の外なら落として区間註釈・ 実体化地平線の外なら警告・被覆域の内側の隙間なら静的エラー(「snapTo: 点が窓の外」——データ破損か 式の取り違えの検出器で、黙って素通しはしない)。 - ラベル射影(
sekki(s))は元の点で読む——snap した後の点はテーブルの要素ではないので読めない。 読む→写すの順で書く(上の例)。 - snapTo は chronos 所属(同じ瞬間を含む窓へ floor)——クロス tz では東京の日先頭が NY の
前日に落ちる(系統的 1 日ずれ・それが chronos の事実)。整合手段は三本: 同じ瞬間なら
snapTo・同じ日付なら
rebase・時刻つきの所属ならcoincides(クロス tz は rebase で同 tz 化してから)。
関連
shift・rebase(日付ラベル対応の再錨)・segmentBy(snap したマーカーで切る)・
結合子(整列検査の整合手段)・公開境界語(spec §3.6)・ADR-27/30/36。