native high-rank ∊ & ⊐

This commit is contained in:
dzaima 2022-12-24 17:07:25 +02:00
parent 3f40955d83
commit 95b1beb9db

View File

@ -40,11 +40,34 @@ static u64 elRange(u8 eltype) { return 1ull<<(1<<elWidthLogBits(eltype)); }
} \
TFREE(tab0);
typedef struct { B n, p; } B2;
static NOINLINE B2 splitCells(B n, B p, bool indexOf) {
#define SYMB (indexOf? "⊐" : "∊")
#define ARG_N (indexOf? "𝕩" : "𝕨")
#define ARG_P (indexOf? "𝕨" : "𝕩")
if (isAtm(p) || RNK(p)==0) thrF("%U: %U cannot have rank 0", SYMB, ARG_P);
ur pr = RNK(p);
if (isAtm(n)) n = m_hunit(n);
ur nr = RNK(n);
if (nr < pr-1) thrF("%U: Rank of %U must be at least the cell rank of %U (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", SYMB, ARG_N, ARG_P, indexOf? p : n, indexOf? n : p);
ur cr = (pr>nr? nr : pr-1);
n = toKCells(n, nr-cr);
p = toKCells(p, pr-cr);
assert(RNK(p)<=1);
return (B2){.n=n, .p=p};
#undef ARG_N
#undef ARG_P
#undef SYMB
}
extern B rt_indexOf;
B indexOf_c2(B t, B w, B x) {
if (!isArr(w) || RNK(w)==0) thrM("⊐: 𝕨 must have rank at least 1");
if (RNK(w)!=1) return c2(rt_indexOf, w, x);
if (RARE(!isArr(w) || RNK(w)!=1)) {
B2 t = splitCells(x, w, true);
w = t.p;
x = t.n;
}
if (!isArr(x) || RNK(x)==0) {
usz wia = IA(w);
B el = isArr(x)? IGetU(x,0) : x;
@ -123,7 +146,11 @@ B enclosed_0;
B enclosed_1;
extern B rt_memberOf;
B memberOf_c2(B t, B w, B x) {
if (isAtm(x) || RNK(x)!=1) return c2(rt_memberOf, w, x);
if (isAtm(x) || RNK(x)!=1) {
B2 t = splitCells(w, x, false);
w = t.n;
x = t.p;
}
if (isAtm(w)) goto single;
ur wr = RNK(w);