From 46704defb6922e9cad377ffac18d3d7ec4b31c63 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Thu, 4 Jul 2024 11:40:05 -0400 Subject: [PATCH] =?UTF-8?q?Convert=20list=E2=8A=B8=E2=86=91=CB=98=20to=20a?= =?UTF-8?q?=20single=20=E2=86=91=20call,=20likewise=20=E2=86=93=20and=20?= =?UTF-8?q?=E2=8C=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/cells.c | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/src/builtins/cells.c b/src/builtins/cells.c index 963e2663..88866a44 100644 --- a/src/builtins/cells.c +++ b/src/builtins/cells.c @@ -7,6 +7,8 @@ B fne_c1(B, B); B shape_c2(B, B, B); B transp_c2(B, B, B); +B take_c2(B, B, B); +B join_c2(B, B, B); // from fold.c: B fold_rows(Md1D* d, B x); @@ -679,21 +681,38 @@ NOINLINE B for_cells_SA(B f, B w, B x, ur xcr, ur xr, u32 chr) { return shift_cells(w, x, cam, xsh[xk], el_or(TI(x,elType), selfElType(w)), rtid); } break; case n_take: case n_drop: { - if (xcr==0 || !isF64(w)) break; bool take = rtid==n_take; - f64* ap; - B a = m_f64arrv(&ap, xk+1); - if (!take) { FILL_TO(ap, el_f64, 0, m_f64(0), xk); } - else { PLAINLOOP for (usz i=0; i1) break; + usz wia = IA(w); + if (xcr < wia) break; // needs rank extension in the middle of x's shape + if (!take) a = C2(take, m_f64(-(i32)(xk+wia)), w); + else a = C2(join, C2(take, m_f64(xk), C1(fne, incG(x))), w); // (k↑≒𝕩)βˆΎπ•¨ + } return takedrop_highrank(take, a, x); } break; case n_reverse: { - if (xcr==0 || !isF64(w)) break; - f64* ap; - B a = m_f64arrv(&ap, xk+1); - FILL_TO(ap, el_f64, 0, m_f64(0), xk); - ap[xk] = o2fG(w); + B a; + if (isF64(w)) { + if (xcr < 1) break; + f64* ap; + a = m_f64arrv(&ap, xk+1); + FILL_TO(ap, el_f64, 0, m_f64(0), xk); + ap[xk] = o2fG(w); + } else { + if (!isArr(w) || RNK(w)>1) break; + usz wia = IA(w); + if (xcr < wia) break; + a = C2(take, m_f64(-(i32)(xk+wia)), w); + } return rotate_highrank(0, a, x); } case n_transp: