diff options
| author | Marshall Lochbaum <mwlochbaum@gmail.com> | 2020-08-08 09:48:47 -0400 |
|---|---|---|
| committer | Marshall Lochbaum <mwlochbaum@gmail.com> | 2020-08-08 09:48:47 -0400 |
| commit | e110a755feee65f1fd177407ae28838299b29f37 (patch) | |
| tree | f4809d9d567ed24c4d0d813e73516f52c7f1535d /src | |
| parent | 8e3c708a6ce60829eb289703dd986ecdf1e54051 (diff) | |
Move impl.bqn to src/r.bqn
Diffstat (limited to 'src')
| -rwxr-xr-x | src/pr.bqn | 2 | ||||
| -rw-r--r-- | src/r.bqn | 455 |
2 files changed, 456 insertions, 1 deletions
@@ -2,7 +2,7 @@ # Process BQN runtime -impl ← •LNS •path∾"../impl.bqn" +impl ← •LNS •path∾"r.bqn" chrs←⟨ "+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍↑↓↕⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!" diff --git a/src/r.bqn b/src/r.bqn new file mode 100644 index 00000000..7b873db7 --- /dev/null +++ b/src/r.bqn @@ -0,0 +1,455 @@ +◶ ← {𝕨((𝕨𝔽𝕩)⊑𝕘){𝔽}𝕩} # LIMITED to number left operand result +⊘ ← {𝕨((1{𝔽}𝕨)-0)◶𝔽‿𝔾 𝕩} +⊢ ← {𝕩} +⊣ ← {𝕩}⊘{𝕨} +˜ ← {𝕩𝔽𝕨⊣𝕩} +∘ ← {𝔽𝕨𝔾𝕩} +○ ← {(𝔾𝕨)𝔽𝔾𝕩} +⊸ ← {(𝔽𝕨⊣𝕩)𝔾𝕩} +⟜ ← {(𝕨⊣𝕩)𝔽𝔾𝕩} +⍟ ← {𝕨((𝕨𝔾𝕩)⊑⊢‿𝕗){𝔽}𝕩} # LIMITED to boolean right operand result + +# LIMITED to numeric arguments for scalar cases +< ← {⟨⟩⥊⟨𝕩⟩} ⊘ (1-≤˜) +> ← (1-≤) +≢ ↩ IsArray◶⟨⟩‿≢ # LIMITED to monadic case +≠ ← (0<=)◶⟨1⋄0⊑≢⟩ + +_fold←{ + ! 1==𝕩 + l←≠v←𝕩 ⋄ F←𝔽 + r←𝕨 (0<l)◶{𝕩⋄Identity f}‿{l↩l-1⋄l⊑𝕩}⊘⊣ 𝕩 + {r↩(𝕩⊑v)F r}⌜(l-1)⊸-⌜↕l + r +} +´ ← _fold + + +#⌜ +# LAYER 2: Pervasion + +ToArray ← <⍟(1-IsArray) +Int←IsArray◶⟨⌊⊸=,0⟩ +Nat←IsArray◶⟨0⊸≤×⌊⊸=,0⟩ + +∾ ← {k←≠𝕨⋄k⊸≤◶⟨⊑⟜𝕨⋄-⟜k⊑𝕩˜⟩⌜↕k+≠𝕩} # LIMITED to two vector arguments + +_eachd←{ + _d←{ # Equal ranks + p←≢𝕨 + ! 1(⊑⟜p=⊑⟜(≢𝕩))⊸×´↕=𝕨 + p⥊ (⊑⟜(⥊𝕨)𝔽⊑⟜(⥊𝕩))⌜↕1×´p + } + _e←{ # 𝕨 has smaller or equal rank + p←≢𝕨 ⋄ k←=𝕨 ⋄ q←≢𝕩 + ! 1(⊑⟜p=⊑⟜q)⊸×´↕k + l←1(q⊑˜k⊸+)⊸×´↕(=𝕩)-k + a←⥊𝕨 ⋄ b←⥊𝕩 + q⥊⥊(≠a) (⊑⟜a𝔽l⊸×⊸+⊑b˜)⌜○↕ l + } + =○=◶⟨>○=◶⟨𝔽_e⋄𝔽˜_e˜⟩⋄𝔽_d⟩ +} + +_perv←{ # Pervasion + R←𝔽{𝕨𝔽_perv𝕩} + +○IsArray◶⟨𝔽⋄R⌜⊘(>○IsArray◶{𝕨{𝕗R𝕩}⌜𝕩}‿{𝕩{𝕩R𝕗}⌜𝕨})⋄R _eachd⟩ +} + +⌜ ↩ {𝔽⌜○ToArray} +¨ ↩ {(𝔽⌜)⊘(𝔽_eachd○ToArray)} + +match←{(0⊑𝕨)◶(1⊑𝕨)‿𝕩}´⟨ + ⟨=○IsArray, 0⟩ + ⟨IsArray∘⊢, =⟩ + ⟨=○= , 0⟩ + ⟨1×´=¨○≢ , 0⟩ + {1×´⥊𝕨Match¨𝕩} +⟩ + +Cmp0 ← ≤˜-≤ +Cmp1 ← (0<1×´≢∘⊢)◶⟨1, IsArray∘⊢◶(1-2×≤)‿{𝕨Cmp1𝕩}⟜(0⊑⥊)⟩ +Cmp ← +○IsArray◶⟨ + Cmp0 + IsArray∘⊣◶⟨Cmp1,-Cmp1˜⟩ + { + lc←𝕨CmpLen○≢𝕩 + cc ← (⊑⟜(⥊𝕨))⊸Cmp⟜(⊑⟜(⥊𝕩)) _getCellCmp´ lc + Cc˜0 + } +⟩ +_grade←{ + ! 1≤=𝕩 + m←1×´1 Cell 𝕩 + cc←m 𝔽○(⊑⟜(⥊𝕩)) _getCellCmp 0 + GT←Cc>0˜ + l←≠𝕩 + B←l⊸≤◶⊢‿l + (↕l){ + i←-d←𝕨 ⋄ j←ei←ej←0 + e←3 ⋄ G←GT○(⊑⟜(m⊸ר⍟(1-m=1)𝕩)) ⋄ c←⟨G,0,1,2⟩ + s←(8≤d)⊑⟨+,{(𝕩-1){𝕩⋄e↩2⋄j↩i⋄i↩𝕩}⍟(1-G)⍟(1-e)𝕩}⟩ + N←{i↩d+𝕨⋄ej↩B d+ei↩B j↩d+𝕩⋄e↩l≤j⋄S ei⋄i R j} + R←{𝕨e◶c𝕩}◶{e+↩2×ei=i↩1+𝕨⋄𝕨}‿{e+↩ej=j↩1+𝕩⋄𝕩}‿N + {(i R j)⊑𝕩}⟜𝕩¨𝕩 + }´(2⋆ni-1+⊢)¨↕ni←-⌊-2 Log l+l=0 +} + +Indices←{ + ! 1==𝕩 + l←≠𝕩 + { + ! 1×´Nat¨𝕩 + k←l-1 + N ← ((⊢+-×0=𝕩⊑˜⊢)`k⊸-⌜↕l)⊑˜k-⊢ # Next nonzero + E ← ⊑⟜(+`𝕩) + ei←E i←N 0 + {{ei↩E i↩N𝕩+1⋄i}⍟(𝕩=ei)i}¨↕E k + }⍟(0<l)𝕩 +} + +_under_←{ + i←↕l←1×´s←≢𝕩 + v←⥊𝕨𝔽○𝔾𝕩 + g←Cmp0 _grade gi←⥊𝔾s⥊i + P←(≠g)⊸≤◶⟨(⊑⟜g)⊑gi˜,l⟩ + e←P j←0 + s⥊{e=𝕩}◶⟨⊑⟜(⥊𝕩),{𝕩⋄r←(j⊑g)⊑v⋄e↩P j↩1+j⋄r}⟩¨i +} +⌾ ← _under_ + ++ ↩ + _perv +- ↩ - _perv +× ↩ (0⊸(<->) ⊘ ×) _perv +÷ ↩ ÷ _perv +⋆ ↩ ⋆ _perv +√ ← ⋆⟜(÷2) ⊘ (⋆⟜÷˜) +| ← (×⟜× ⊘ {𝕩-𝕨×⌊𝕩÷𝕨}) _perv +⌊ ↩ (⌊ ⊘ {(𝕨>𝕩)⊑𝕨‿𝕩}) _perv +⌈ ← (-∘⌊∘- ⊘ {(𝕨<𝕩)⊑𝕨‿𝕩}) _perv +¬ ← 1+- +∧ ← × +∨ ← (+-×) +< ↩ {⟨⟩⥊⟨𝕩⟩} ⊘ ((1-≤˜) _perv) +> ↩ (1-≤) _perv +≠ ↩ ≠ ⊘ ((1-=) _perv) += ↩ = ⊘ (= _perv) +≥ ← !∘0 ⊘ (≤˜_perv) +≤ ↩ !∘0 ⊘ (≤ _perv) +identity ← (0⊑⟨!∘0⟩) {(0⊑𝕨){𝕗=𝕩}◶𝕩‿(1⊑𝕨)}´ ⟨+‿0,-‿0,×‿1,÷‿1,⋆‿1,√‿1,∧‿1,∨‿0,|‿0,⌊‿∞,⌈‿¯∞,<‿0,≤‿1,=‿1,≥‿1,>‿0,≠‿0⟩ + +SelSub←{ + ! IsArray 𝕨 + ! 1×´⥊Int¨ 𝕨 + l←≠𝕩 + ! 1×´⥊ ((-l)⊸≤×l⊸>)¨ 𝕨 + ((⊢+l×0>⊢)¨𝕨)(1==𝕩)◶{ + c←1×´s←1 Cell 𝕩 + 𝕨((⥊𝕩)⊑˜c⊸×⊸+)⌜s⥊↕c + }‿{ + ⊑⟜𝕩¨𝕨 + }𝕩 +} + + +#⌜ +# LAYER 3: Remove other limits +# Now all implementations are full except ∾ and ⊑; ↕ is monadic only + +Deshape←IsArray◶{⟨𝕩⟩}‿⥊ +Reshape←{ + ! 1≥=𝕨 + 𝕨↩Deshape 𝕨 + ! ∧´Nat¨𝕨 + l←×´𝕨 + n←×´≢𝕩 + 𝕨⥊{ + 𝕩(0<n)◶⟨Type⊸(⊣⌜)⋄⥊⊸{⊑⟜𝕨¨n|𝕩}⟩↕l + }⍟(l≠n)𝕩 +}⟜ToArray +⥊ ↩ Deshape ⊘ Reshape + +Range←{ + I←{!Nat𝕩⋄↕𝕩} + M←{!1==𝕩⋄(<⟨⟩)⥊⊸∾⌜´I¨𝕩} + IsArray◶I‿M 𝕩 +} + +Depth←IsArray◶0‿{1+0⌈´Depth¨⥊𝕩} + +≡ ← Depth ⊘ Match +≢ ↩ ≢ ⊘ (¬Match) + + +#⌜ +# LAYER 4: Operators + + +DropV← {⊑⟜𝕩¨𝕨+↕𝕨-˜≠𝕩} +Cell ← DropV⟜≢ +Pair ← {⟨𝕩⟩} ⊘ {⟨𝕨,𝕩⟩} + +Merge←{ + c←≢0⊑⥊𝕩 + ! ∧´⥊(c≡≢)¨𝕩 + 𝕩⊑⟜⥊˜⌜c⥊↕×´c +}⍟(0<≠∘⥊) +> ↩ Merge ⊘ > +≍ ← >∘Pair +_ranks ← {⟨2⟩⊘⟨1,0⟩((⊣-1+|)˜⟜≠⊑¨<∘⊢)⥊∘𝔽} +_depthOp_←{ + neg←0>n←𝕨𝔾_ranks𝕩 ⋄ F←𝔽 + _d←{ + R←(𝕗+neg)_d + 𝕨(×⟜2⊸+´2⥊(neg∧𝕗≥0)∨(0⌈𝕗)≥Pair○≡)◶(⟨R¨⋄R⟜𝕩¨∘⊣⋄(𝕨R⊢)¨∘⊢⋄F⟩)𝕩 + } + 𝕨 n _d 𝕩 +} +⚇ ← _depthOp_ +_rankOp_←{ + k←𝕨(Pair○= (0≤⊢)◶⟨⌊⟜-,0⌈-⟩¨ 𝔾_ranks)𝕩 + Enc←{ + f←⊑⟜(≢𝕩)¨↕𝕨 + c←×´s←𝕨Cell𝕩 + f⥊⊑⟜(⥊𝕩)¨∘((s⥊↕c)+c×⊢)¨↕×´f + } + Enc↩(>⟜0+≥⟜=)◶⟨<⊢,Enc,<¨⊢⟩ + > ((0⊑k)Enc𝕨) 𝔽¨ ((1-˜≠)⊸⊑k)Enc𝕩 +} +⎉ ← _rankOp_ +˘ ← {𝔽⎉¯1} +_insert←{ + ! 1≤=𝕩 + 𝕨 𝔽´ <˘𝕩 +} +˝ ← _insert + + +#⌜ +# LAYER 5: Structural functions + +_onAxes_←{ + F←𝔽 + (𝔾<≡)∘⊣◶{ # One axis + ! 1≤=𝕩 + 𝕨F𝕩 + }‿{ # Multiple axes + ! 1≥=𝕨 + ! 𝕨≤○≠≢𝕩 + l←≠𝕨 ⋄ W←⊑⟜(⥊𝕨) + 0{(W𝕨)F(1+𝕨)⊸𝕊˘⍟(𝕨<l-1)𝕩}⍟(0<l)𝕩 + } +} + +Select←ToArray⊸(SelSub _onAxes_ 1) +⊏ ← 0⊸Select ⊘ Select + +JoinTo←∨○(1≠=)◶∾‿{ + s←𝕨Pair○≢𝕩 + a←1⌈´k←≠¨s + ! ∧´1≥a-k + c←(k¬a)+⟜(↕a-1)⊸⊏¨s + ! ≡´c + l←+´(a=k)⊣◶1‿(0⊑⊢)¨s + (⟨l⟩∾0⊑c)⥊𝕨∾○⥊𝕩 +} + +Take←{ + T←{ + ! Int 𝕨 + l←≠𝕩 ⋄ n←𝕨<0 ⋄ e←l⌊r←|𝕨 ⋄ s←⟨r⟩ + i ← 𝕩{s∾↩c←1 Cell 𝕨⋄𝕩(×+⌜↕∘⊢)×´c}⍟(1≠=𝕩) (l-e)+⍟n ↕e + s ⥊ 𝕩{(⥊𝕩)n◶⟨∾,∾˜⟩(r-e)⥊Type𝕗}⍟(l<r) ⊑⟜(⥊𝕩)¨i + } + 𝕨 T _onAxes_ 0 (⟨1⟩⥊˜0⌈𝕨-○≠⊢)⊸∾∘≢⊸⥊𝕩 +} +Prefixes ← {!1≤=𝕩 ⋄ (↕1+≠𝕩)Take¨<𝕩} +↑ ← Prefixes ⊘ Take +Drop←{ + s←(≠𝕨)(⊣↑⊢∾˜1⥊˜0⌈-⟜≠)≢𝕩 + ((sׯ1⋆𝕨>0)+(-s)⌈s⌊𝕨)↑𝕩 +} +Suffixes ← {!1≤=𝕩 ⋄ (↕1+≠𝕩)Drop¨<𝕩} +↓ ← Suffixes ⊘ Drop + +Windows←{ + ! IsArray 𝕩 + ! 1≥=𝕨 + ! 𝕨≤○≠≢𝕩 + ! ∧´Nat¨⥊𝕨 + s←(≠𝕨)↑≢𝕩 + ! ∧´𝕨≤1+s + 𝕨{(∾⟜(𝕨≠⊸↓≢𝕩)∘≢⥊>)<¨⊸⊏⟜𝕩¨s(¬+⌜○Range⊢)⥊𝕨}⍟(0<≠𝕨)𝕩 +} + +Reverse ← {!1≤=𝕩 ⋄ (-↕⊸¬≠𝕩)⊏𝕩} +Rotate ← {!Int𝕨 ⋄ l←≠𝕩⋄(l|𝕨+↕l)⊏𝕩} _onAxes_ 0 + +Rep ← Indices⊸⊏ +Replicate ← {0<=𝕨}◶(⥊˜⟜≠Rep⊢)‿{!𝕨=○≠𝕩⋄𝕨Rep𝕩} _onAxes_ (1-0=≠) + +↕ ↩ Range ⊘ Windows +⌽ ← Reverse ⊘ Rotate +/ ← Indices ⊘ Replicate + + +#⌜ +# LAYER 6: Everything else + +Join←(1≠=)◶⟨∨´1≠=¨,1⟩◶{ + # List of lists + i←j←¯1⋄e←⟨⟩⋄a←𝕩 + {{e↩a⊑˜i↩𝕩⋄j↩¯1}⍟(i⊸≠)𝕩⋄(j↩j+1)⊑e}¨/≠¨𝕩 +}‿{ + # Multidimensional + C←(<⟨⟩)⥊⊸∾⌜´⊢ # Cartesian array product + ! IsArray 𝕩 + s←≢¨𝕩 + d←≠0⊑⥊s + ! ∧´⥊d=≠¨s + ! d≥=𝕩 + l←(≢𝕩){(𝕩⊑⟜≢a Pick1˜(j=𝕩)⊸×)¨↕𝕨}¨j←↕r←=a←𝕩 + ! (r↑¨s)≡C l + i←C{p←+´¨↑𝕩⋄(↕0⊑⌽p)-𝕩/¯1↓p}¨l + >i<¨⊸⊏¨l/𝕩 +}⍟(0<≠∘⥊) + +Group←{ + ! IsArray 𝕩 + Chk←{!1==𝕩⋄!∧´Int¨𝕩⋄!∧´¯1≤𝕩⋄≠𝕩} + l←(1<≡)◶Chk‿{!1==𝕩⋄Chk¨𝕩}𝕨 + ! l≤○≠≢𝕩 + ! ∧´l=l≠⊸↑≢𝕩 + (𝕨⊸=/𝕩˜)¨↕1+¯1⌈´⚇1𝕨 +} + +∾ ↩ Join ⊘ JoinTo +⊔ ← Group⟜(↕≠⚇1) ⊘ Group + +Pick1←{ + ! 1==𝕨 + ! 𝕨=○≠s←≢𝕩 + ! ∧´Int¨𝕨 + ! ∧´𝕨(≥⟜-∧<)s + 𝕨↩𝕨+s×𝕨<0 + (⥊𝕩)⊑˜0(⊑⟜𝕨+⊑⟜s×⊢)´-↕⊸¬≠𝕨 +} +Pickd←(∨´∘⥊IsArray¨∘⊣)◶Pick1‿{Pickd⟜𝕩¨𝕨} +Pick←IsArray◶⥊‿⊢⊸Pickd + +# Searching +IndexOf←{ + c←1-˜=𝕨 + ! 0≤c + 𝕨 (0<≠𝕨)◶⟨0⎉c∘⊢,(+˝∧`)≢⌜○((0<c)◶⟨⊢,<⎉c⟩)⟩ 𝕩 +} +UniqueMask←{ + ! 1≤=𝕩 + u←0↑𝕩 + {(≠u)>0⊑⥊u IndexOf 𝕩}◶{u↩u∾𝕩⋄1}‿0˘𝕩 +} +Find←{ + r←=𝕨 + ! r≤=𝕩 + 𝕨 ≡⎉r (≢𝕨) ↕⎉r 𝕩 +} + +⊐ ← !∘0 ⊘ IndexOf +∊ ← UniqueMask ⊘ (⊐˜<≠∘⊢) +⍷ ← ∊⊸/ ⊘ Find + +ReorderAxes←{ + 𝕩↩<⍟(0=≡)𝕩 + ! 1≥=𝕨 + 𝕨↩⥊𝕨 + ! 𝕨≤○≠≢𝕩 + ! ∧´Nat¨⥊𝕨 + r←(=𝕩)-+´¬∊𝕨 + ! ∧´𝕨<r + 𝕨↩𝕨∾𝕨(¬∘∊˜/⊢)↕r + (𝕨⊸⊏Pick𝕩˜)¨↕⌊´¨𝕨⊔≢𝕩 +} +Transpose←(=-1˜)⊸ReorderAxes⍟(0<=) +⍉ ← Transpose ⊘ ReorderAxes + +# Sorting +CmpLen ← { + e←𝕨-˜○(∨´0⊸=)𝕩 + 𝕨(e=0)◶⟨0,e⟩‿{ + c←×𝕨-○≠𝕩 + r←𝕨⌊○≠𝕩 + l←𝕨{ + i←+´∧`𝕨=𝕩 + m←×´⊑⟜𝕨¨↕i + {c↩×-´𝕩⋄m↩m×⌊´𝕩}∘(⊑¨⟜𝕨‿𝕩)⍟(r⊸>)i + m + }○(((-1+↕r)+≠)⊸{⊑⟜𝕩¨𝕨})𝕩 + ⟨l,c⟩ + }𝕩 +} +_getCellCmp ← { + Ci←𝔽⋄l←𝕨⋄c←𝕩 + Cc←{ + a←𝕨⋄b←𝕩 + S←(l⊸=)◶{S∘(1+𝕩)⍟(0⊸=)a Ci○(𝕩⊸+)b}‿c + S 0 + } + (1≠l)⊑(𝕩⍟(0⊸=)𝔽)‿Cc +} + +_binSearch ← { + B ← 𝔽 + { + R←{𝕨{a←B m←𝕩+h←⌊𝕨÷2⋄(h+a×2|𝕨)R a⊑𝕩‿m}⍟(>⟜1)𝕩} + 1+(𝕩+1)R ¯1 + }⍟(0⊸<) +} +_bins←{ + c←1-˜=𝕨 + ! 0≤c + ! c≤=𝕩 + lw←×´sw←1 Cell 𝕨 + cw←lw 𝔽○(⊑⟜(⥊𝕨)) _getCellCmp 0 + ! 0⊸<◶⟨1,∧´0≤˜·cw¨⟜(lw⊸+)lw×↕∘-⟜1⟩≠𝕨 + cx←c-˜=𝕩 + sx←cx Cell 𝕩 ⋄ lc←sw CmpLen sx + cc ← (⊑⟜(⥊𝕨))⊸𝔽⟜(⊑⟜(⥊𝕩)) _getCellCmp´ lc + B←(×´sw)⊸×⊸Cc≤0˜ + (≠𝕨) {B⟜𝕩 _binSearch 𝕨}¨ (×´sx) × ⥊⟜(↕×´)⊑⟜(≢𝕩)¨↕cx +} + +⍋ ← Cmp _grade ⊘ ( Cmp _bins) +⍒ ← -∘Cmp _grade ⊘ (-∘Cmp _bins) +∧ ↩ ⍋⊸⊏ ⊘ ∧ +∨ ↩ ⍒⊸⊏ ⊘ ∨ + +OccurrenceCount ← ⊐˜(⊢-⊏)⍋∘⍋ +ProgressiveIndexOf ← {𝕨⊐○(≍˘⟜OccurrenceCount𝕨⊸⊐)𝕩} +⊒ ← OccurrenceCount⊘ ProgressiveIndexOf + +⊑ ↩ (0⊑⥊) ⊘ Pick +◶ ↩ {𝕨((𝕨𝔽𝕩)⊑𝕘){𝔽}𝕩} # Same definition, new Pick + +inverse ← {(⊑(0⊏𝕩)⊐<) ⊑ ((1⊏𝕩)∾⟨!∘0⟩)˜} ⍉ (2∾˜2÷˜≠)⊸⥊ ⟨ + +, +⊘(-˜) + -, - + ×, ⊢⊘(÷˜) + ÷, ÷ + ⋆, Log _perv + √, ⋆⟜2⊘(⋆˜) + ∧, ⊢⊘(÷˜) + ∨, ⊢⊘(-˜÷1-⊢) + <, {!IsArray𝕩⋄!0==𝕩⋄⊑𝕩}⊘(!∘0) + /, {!(⍋≡↕∘≠)𝕩⋄≠¨⊔𝕩}⊘(!∘0) +⟩ +⁼ ← {Inverse 𝕗} + +_repeat_←{ + n←𝕨𝔾𝕩 + l←u←0 + {!Int𝕩⋄l↩l⌊𝕩⋄u↩u⌈𝕩}⚇0 n + a←𝕩⋄_p←{𝔽∘⊣`(1+𝕩)⥊<a} + pos←(𝕨𝔽 ⊢)_p u + neg←(𝕨𝔽⁼⊢)_p-l + (|⊑<⟜0⊑pos‿neg˜)⚇0 n +} +⍟ ↩ _repeat_ |
