From 663c3182196b58f4b98a50ac4f82795af78e23b5 Mon Sep 17 00:00:00 2001 From: dzaima Date: Fri, 17 Sep 2021 14:46:03 +0300 Subject: [PATCH] deep squeeze --- src/core/stuff.c | 15 +++++++++++++++ src/core/stuff.h | 1 + 2 files changed, 16 insertions(+) diff --git a/src/core/stuff.c b/src/core/stuff.c index 89def0eb..db1de84b 100644 --- a/src/core/stuff.c +++ b/src/core/stuff.c @@ -569,6 +569,21 @@ B any_squeeze(B x) { return x; } +B squeeze_deep(B x) { + x = any_squeeze(x); + if (TI(x,elType)!=el_B) return x; + usz ia = a(x)->ia; + usz i=0; HArr_p r = m_harrs(ia,&i); + B* xp = arr_bptr(x); + if (xp!=NULL) { + while (i < ia) { r.a[i] = squeeze_deep(inc(xp[i])); i++; } + } else { + SGet(x); + while (i < ia) { r.a[i] = squeeze_deep(Get(x,i)); i++; } + } + return any_squeeze(harr_fcd(r, x)); +} + B bqn_merge(B x) { assert(isArr(x)); usz xia = a(x)->ia; diff --git a/src/core/stuff.h b/src/core/stuff.h index fdf05b99..403fcbad 100644 --- a/src/core/stuff.h +++ b/src/core/stuff.h @@ -140,6 +140,7 @@ B bqn_merge(B x); // consumes B any_squeeze(B x); // consumes; accepts any array, returns one with the smallest type (doesn't recurse!) B num_squeeze(B x); // consumes; accepts any array, but only tries to squeeze numerical values; doesn't check for fl_squoze B chr_squeeze(B x); // consumes; accepts any array, but only tries to squeeze character values; doesn't check for fl_squoze +B squeeze_deep(B x); // consumes; accepts any object, returns an object with all hashable parts squeezed static inline B num_squeezeChk(B x) { return FL_HAS(x,fl_squoze)? x : num_squeeze(x); } static inline B chr_squeezeChk(B x) { return FL_HAS(x,fl_squoze)? x : chr_squeeze(x); } B def_fn_uc1(B t, B o, B x);