#!/usr/bin/env dbqn

EQ ← ≡○•HASH # not using just ≡ because NaN is annoying

T ← EQ◶{•←"Expected `"∾(1⍕𝕨)∾"` and `"∾(1⍕𝕩)∾"` to be equal"}‿⟨⟩

CL ← {𝕩↑˜⊑𝕩⊐'.'}⌾⌽ •Class

   "BitArr"T CL       0‿1
   "BitArr"T CL 10•DR 0‿1
   "IntArr"T CL 12•DR 0‿1
"DoubleArr"T CL 11•DR 0‿1

Tps ← {
  r ← ⟨11•DR 𝕩⟩
  r∾↩ 𝕨◶{<12•DR 𝕩}‿{<12•DR 𝕩}‿{(∧´0=1|𝕩)◶⟨⟩‿{<12•DR 𝕩}𝕩} 𝕩
  r∾↩ 𝕨◶⟨⟩        ‿{<10•DR 𝕩}‿{(∧´ 𝕩∊↕2)◶⟨⟩‿{<10•DR 𝕩}𝕩} 𝕩
  (⊢≡1⌽⊢)◶{𝕩:•←"failed type conversion"}‿⟨⟩ r
  r
}


•rl←0
a0_1 ← 1 Tps •Rand 200⥊2
b0_1 ← 1 Tps •Rand 200⥊2
ma ← ⟨a0_1 ⋄ 2 Tps 5+•Rand 200⥊10⟩
ta ← (∾ma) ∾ 2 Tps 5.5+•Rand 200⥊10

scd ← "⋆⁼"<⊸∾ "+-×÷|<≤=≥>≠⋆∨∧⌊⌈√¬"
_err ← { Fn _𝕣:
  # Fn⎊{•←"ERROR "∾(1⍕fn)∾": "∾(" "∾1⍕𝕨)⊢⊘∾" 𝕊 "∾1⍕𝕩 ⋄ "err"}
  Fn⎊"err"
}
# dyadic AA
{ 𝕊 f:
  Fc ← F _err
  r ← a0_1 Fc⌜ b0_1
  c ← r EQ¨ <⊑r
  ∧´∘⥊◶{•←(1⍕f)∾": failed AA"∾∾' '∾¨∾¨<˘1⍕¨𝕩}‿1 c
}¨⍎¨ scd ∾ "/∊∾≍⊔"


# dyadic As&sA vs AA
{ 𝕊 f:
  { 𝕊 dir:
    Fc ← (dir⊑⟨F⋄F˜⟩) _err
    { 𝕊s:
      { 𝕊ca:
        a ← (≠ca) ⥊ s
        (a EQ○(ca⊸Fc) s)◶{𝕩:•←(1⍕f)∾": failed scalar "∾(dir⊑"𝕩"‿"𝕨")∾" ≡ "∾1⍕s}‿⟨⟩ 0
      }¨ ta
    }¨ 0‿1‿2‿2.5
  }¨ 0‿1
}¨⍎¨ scd

# dyadic As & sA vs different types
{ 𝕊 f:
  { 𝕊 dir:
    Fc ← (dir⊑⟨F⋄F˜⟩) _err
    ma { a 𝕊 s:
      r ← a Fc¨ s
      c ← r EQ¨ <⊑r
      ∧´◶{𝕩:•←(1⍕f)∾": failed scalar "∾(dir⊑"𝕩"‿"𝕨")∾" ≡ "∾(1⍕s)∾"; "∾(dir⊑"𝕨"‿"𝕩")∾" is"∾ ∾' '∾¨ c ¬⊸/ CL¨ a}‿1 c
    }⌜ 0‿1‿2‿2.5
  }¨ 0‿1
}¨⍎¨ scd

# monadic
{ 𝕊 f:
  Fc ← F _err
  { 𝕊 a:
    (a EQ○Fc 11•DR a)◶{𝕩:•←(1⍕f)∾": failed monadic "∾CL a}‿⟨⟩ 0
  }¨ ta
}¨⟨
  9⊸↑, 1000⊸↑  ⋄  ¯9⊸↑, ¯1000⊸↑
  9⊸↓, 1000⊸↓  ⋄  ¯9⊸↓, ¯1000⊸↓
  0⊸∾, 1⊸∾, 2⊸∾, 2.5⊸∾  ⋄  ∾⟜0, ∾⟜1, ∾⟜2, ∾⟜2.5
  4‿5⊸⥊, 100‿100⊸⥊, 20⊸⥊, 10⊸⥊, 1000⊸⥊
  ⍉4‿5⊸⥊ ⋄ <˘4‿5⊸⥊ ⋄ {><˘4‿5⥊𝕩}
  10⊸⊑ ⋄ (⥊¨3‿4)⊸⊑ ⋄ 3⊸⊏ ⋄ 3‿4⊸⊏ ⋄ 10‿10⊸⥊ ⋄ ⊏⟜(↕20) ⋄ (↕20)⊸⊏ ⋄ (⌽↕20)⊸⊏
  ⥊, ⌽, /, ∊, ⍷, ⍋, ⍒, ⊔
  +´, ×´, ⌊´, ⌈´, ∨´, ∧´, ≠´
  +`, ×`, ⌊`, ⌈`, ∨`, ∧`, ≠`
⟩ ∾ ⍎¨ "+-×÷|=≠⋆∨∧⌊⌈√¬"