Compute Insert identity natively
This commit is contained in:
parent
5d4391a3fd
commit
9d5caad9a9
@ -381,22 +381,39 @@ static B m1c1(B t, B f, B x) { // consumes x
|
||||
decG(fn);
|
||||
return r;
|
||||
}
|
||||
extern GLOBAL B rt_insert;
|
||||
extern B insert_base(B f, B x, bool has_w, B w); // from cells.c
|
||||
|
||||
B insert_c1(Md1D* d, B x) { B f = d->f;
|
||||
if (isAtm(x) || RNK(x)==0) thrM("˝: 𝕩 must have rank at least 1");
|
||||
ur xr;
|
||||
if (isAtm(x) || (xr=RNK(x))==0) thrM("˝: 𝕩 must have rank at least 1");
|
||||
usz len = *SH(x);
|
||||
if (len==0) { SLOW2("!𝕎˝𝕩", f, x); return m1c1(rt_insert, f, x); }
|
||||
if (len==0) {
|
||||
if (isFun(f)) {
|
||||
B id = TI(f,identity)(f);
|
||||
if (!q_N(id)) {
|
||||
if (isArr(id)) { decG(x); return id; } // arithmetic with table
|
||||
usz* xsh = SH(x);
|
||||
Arr* r = reshape_one(shProd(xsh, 1, xr), id);
|
||||
if (xr == 2) arr_shVec(r); else {
|
||||
usz* rsh = arr_shAlloc(r, xr-1);
|
||||
shcpy(rsh, xsh+1, xr-1);
|
||||
}
|
||||
decG(x); return taga(r);
|
||||
} else if (v(f)->flags == n_join+1) {
|
||||
if (xr <= 1) thrM("˝: Identity does not exist");
|
||||
goto join;
|
||||
}
|
||||
}
|
||||
thrM("˝: Identity not found");
|
||||
}
|
||||
if (len==1) return C1(select, x);
|
||||
if (RARE(!isFun(f))) { decG(x); if (isMd(f)) thrM("Calling a modifier"); return inc(f); }
|
||||
ur xr = RNK(x);
|
||||
if (xr==1 && isPervasiveDyExt(f)) return m_unit(fold_c1(d, x));
|
||||
if (v(f)->flags) {
|
||||
u8 rtid = v(f)->flags-1;
|
||||
if (rtid==n_ltack) return C1(select, x);
|
||||
if (rtid==n_rtack) return C2(select, m_f64(-1), x);
|
||||
if (rtid==n_join) {
|
||||
if (rtid==n_join) { join:;
|
||||
if (xr==1) return x;
|
||||
ShArr* rsh;
|
||||
if (xr>2) {
|
||||
|
||||
@ -129,7 +129,7 @@ NOINLINE B load_fullpath(B path, B name) {
|
||||
|
||||
GLOBAL HArr* comps_curr;
|
||||
|
||||
GLOBAL B rt_undo, rt_select, rt_slash, rt_insert, rt_depth,
|
||||
GLOBAL B rt_undo, rt_select, rt_slash, rt_depth,
|
||||
rt_group, rt_under, rt_find;
|
||||
Block* load_buildBlock(B x, B src, B path, B name, Scope* sc, i32 nsResult) { // consumes x,src
|
||||
B fullpath = load_fullpath(path, name);
|
||||
@ -500,7 +500,6 @@ void load_init() { // very last init function
|
||||
gc_add(rt_under = Get(rtObjRaw, n_under ));
|
||||
gc_add(rt_find = Get(rtObjRaw, n_find ));
|
||||
gc_add(rt_depth = Get(rtObjRaw, n_depth ));
|
||||
gc_add(rt_insert = Get(rtObjRaw, n_insert));
|
||||
|
||||
for (usz i = 0; i < RT_LEN; i++) {
|
||||
#ifdef RT_WRAP
|
||||
@ -542,7 +541,7 @@ void load_init() { // very last init function
|
||||
load_rt = frtObj;
|
||||
|
||||
rt_select = rt_slash = rt_group = rt_find = bi_invalidFn;
|
||||
rt_undo = rt_insert = bi_invalidMd1;
|
||||
rt_undo = bi_invalidMd1;
|
||||
rt_under = rt_depth = bi_invalidMd2;
|
||||
|
||||
rt_invFnRegFn = rt_invFnSwapFn = invalidFn_c1;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user