shift — 単位 n 個ぶん動かす
分類: 点変換(本体層 core) / シグネチャ: shift(n, unit: U) : Stream -> Stream / 名は確定(spec §5.4)
意味
各点を、単位 U で n 個ぶん動かす。方向は符号で表し、方向語(back: 等)は採らない——n を
変数化したとき方向が語と符号に二重化するため(ADR-21)。
U は premise 相対の軸名で、二つの顔がある:
- 窓単位(
day・monthなど)——属する窓の添字を動かす。窓内のオフセットは経過時間で 保存される(ADR-31 改訂 2=F83。着地=着地窓の開始+経過オフセット。DST 切替日をまたぐと壁時計は 変わる——NY で[3/7T09:00] |> shift(+1, unit: day)→ 3/8 10:00。壁時計に貼り付く決まりは 宣言側〈実体の sessionOpens・時刻付き anchor の tick〉の領分。オフセットが着地窓の幅を超えれば次窓へ 掛かる——寄せるのは roll の係)。 - 点列軸(
bizDayなど離散の有効点列)——軸上の位置を動かす。点が軸上に無ければ静的エラー (先にrollで有効点へ寄せる。I3 の精神)。
例
月末の 3 営業日前(代表例 §7.1。1 月: 月末 1/31 土 → roll で 1/30 金 → 3 営業日戻って 1/27 火):
# eval: 2026-01-01..2026-02-01
@JP
monthEnd |> roll(Preceding, on: bizDay) |> shift(-3, unit: bizDay)
#=> 2026-01-27
#~> 範囲外 2026-01-01..2026-01-02(holidays2026 covering 2026-01-01..2026-12-31, asof 2026-01-05)
窓単位はオフセット保存——八十八夜(立春の瞬間 2/4 05:02 の 87 日後)は時刻ごと動く:
# eval: 2026-01-01..2026-06-01
@JP
sekki = [2026-01-05T17:23, 2026-01-20T10:45, 2026-02-04T05:02]
covering: 2026..2026
labels: [小寒, 大寒, 立春]
sekki |> filter(s => sekki(s) == 立春) |> shift(+87, unit: day)
#=> 2026-05-02T05:02
#~> 範囲外 2026-01-01..2026-03-29(sekki covering 2026-01-01..2026-12-31)
日付に落とすなら後段に snapTo(day) を足す。
落とし穴
rollは「無効なら寄せる」(有効点は不動)、shiftは「必ず動かす」。休日調整は roll、 「N 営業日前」は shift——両方要るのが月末オフセットの定石。unit: bizDayの点が営業日でないと静的エラー。roll |> shiftの順を守る。- 可変幅の範囲 shift(±k 日の帯)は未導入(fold が要る。宿題 F26)——固定幅なら和で列挙する。
- 点列軸(
unit: bizDay)は入力と軸の整列一致を要する(ADR-36)。窓語(unit: day等)は 区間所属(窓内オフセット保存)なので検査対象外——時刻付きの点をshift(+87, unit: day)で 動かす形は合法(八十八夜の定石)。