summaryrefslogtreecommitdiff
path: root/functions.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-02-02 14:30:28 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-02-02 14:30:28 +0000
commit4939a12089e160471590e3812d4533bae34dd64d (patch)
treebdbb57ddb1fefb6b225d5dc834984275bed2e577 /functions.c
parenta65afb1bc34697b7049ce21af5c617fcfe989c5c (diff)
Implement find ⍷
Diffstat (limited to 'functions.c')
-rw-r--r--functions.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/functions.c b/functions.c
index e3020f9..f1c4b0d 100644
--- a/functions.c
+++ b/functions.c
@@ -103,7 +103,7 @@ fndyad dyadfunctiondefs[] = {
fnIndexOf, /* ⍳ */
fnIntervalIndex, /* ⍸ */
fnMembership, /* ∊ */
- 0, /* ⍷ */
+ fnFind, /* ⍷ */
fnUnion, /* ∪ */
fnIntersection, /* ∩ */
fnExcluding, /* ~ */
@@ -1586,6 +1586,33 @@ fnMembership(Array *left, Array *right)
}
Array *
+fnFind(Array *left, Array *right)
+{
+ int i,j;
+ if(left->rank > right->rank){
+ print("Left rank larger\n");
+ return rundfn(L"(⍴⍵)⍴0", nil, nil, nil, right);
+ }
+
+ if(left->rank < right->rank){
+ Array *newleft = allocarray(left->type, right->rank, left->size);
+ for(i = 0; i < right->rank - left->rank; i++)
+ newleft->shape[i] = 1;
+ for(j = 0; j < left->rank; j++)
+ newleft->shape[i+j] = left->shape[j];
+ memcpy(newleft->rawdata, left->rawdata, datasizes[left->type] * left->size);
+ if(left->type == AtypeArray)
+ for(i = 0; i < left->size; i++)
+ incref(newleft->arraydata[i]);
+ left = newleft;
+ }else
+ left = fnSame(left);
+ Array *result = rundfn(L"⎕io←0 ⋄ (⍴⍵)↑(⍺{⍶≡(⍴⍶)↑⍵↓⍹}⍵)¨⍳1+⍵-⍥⍴⍺", nil, nil, left, right);
+ freearray(left);
+ return result;
+}
+
+Array *
fnUnion(Array *left, Array *right)
{
if(left->rank > 1 || right->rank > 1)