Skip to content

Commit

Permalink
add array stdlib module
Browse files Browse the repository at this point in the history
  • Loading branch information
eWert-Online committed Aug 11, 2023
1 parent 29b8638 commit cb9ee05
Show file tree
Hide file tree
Showing 3 changed files with 181 additions and 0 deletions.
1 change: 1 addition & 0 deletions lib/pinc_includes/stdlib/Base.pi
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
library Base {
use Char = Base__Char;
use String = Base__String;
use Array = Base__Array;
}
148 changes: 148 additions & 0 deletions lib/pinc_includes/stdlib/Base__Array.pi
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
library Base__Array {
let make = fn (length) -> {
0..length
}

let init = fn (length, f) -> {
for (index in make(length)) {
f(index)
}
}

let length = fn (array) -> {
let mutable len = 0;
for (_ in array) len := len + 1;
len
}

let map = fn (array, f) -> {
for (item in array) {
f(item)
}
}

let map_reverse = fn (array, f) -> {
for (item in reverse array) {
f(item)
}
}

let mapi = fn (array, f) -> {
for (index, item in array) {
f(index, item)
}
}

let mapi_reverse = fn (array, f) -> {
for (index, item in reverse array) {
f(index, item)
}
}

let partition = fn (array, condition) -> {
let len = Base.Array.length(array);
let part = fn (yes, no, index) -> {
if index == len {
[yes, no]
} else {
let item = array[index];
if condition(item) {
part(yes <- item, no, index + 1);
} else {
part(yes, no <- item, index + 1);
}
}
};
part([], [], 0)
}

let filter = fn (array, condition) -> {
let len = Base.Array.length(array);
let aux = fn (acc, index) -> {
if index == len {
acc
} else {
let item = array[index];
if condition(item) {
aux(acc <- item, index + 1);
} else {
aux(acc, index + 1);
}
}
};
aux([], 0)
}

let keep = filter

let find = fn (array, condition) -> {
let len = Base.Array.length(array);
let aux = fn (index) -> {
if index < len {
let item = array[index];
if condition(item) {
item
} else {
aux(index + 1);
}
}
};
aux(0)
}

let exists = fn (array, condition) -> {
let len = Base.Array.length(array);
let aux = fn (index) -> {
if index < len {
let item = array[index];
if condition(item) {
true
} else {
aux(index + 1);
}
} else {
false
}
};
aux(0)
}

let some = exists

let for_all = fn (array, condition) -> {
let len = Base.Array.length(array);
let aux = fn (acc, index) -> {
if index == len || acc == false {
acc
} else {
let item = array[index];
aux(acc && condition(item), index + 1);
}
};

aux(true, 0)
}

let every = for_all

let fold_left = fn(array, init, f) -> {
let len = Base.Array.length(array);
let aux = fn (acc, index) -> {
if index == len || acc == false {
acc
} else {
let item = array[index];
let acc = f(acc, item);
aux(acc, index + 1);
}
};

aux(init, 0)
}

let reduce = fold_left

let nth = fn (array, index) -> {
array[index]
}
}
32 changes: 32 additions & 0 deletions test/array.t/data.pi
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ component C {
let nested_array = new_array <- (merged_array <- merged_record_2);
let index = 8;

let partitioned = merged_array_2 |> Base.Array.partition(fn (item) -> {item % 2 == 0});
let even = partitioned[0];
let odd = partitioned[1];

<section>
{array}

Expand All @@ -28,5 +32,33 @@ component C {

{nested_array[2 + 3 * 1][index]["y"]}
{nested_array[2 + 3 * 1][index].y}

{even}

{odd}

{merged_array_2 |> Base.Array.keep(fn (item) -> {item % 2 == 0})}

{if (merged_array_2 |> Base.Array.find(fn (item) -> {item == 3})) {
"FOUND"
} else {
"NOT FOUND"
}}

{if merged_array_2 |> Base.Array.find(fn (item) -> {item == -10}) {
"FOUND"
} else {
"NOT FOUND"
}}

{even |> Base.Array.every(fn (item) -> {item % 2 == 0})}
{merged_array_2 |> Base.Array.some(fn (item) -> {item % 2 == 0})}
{merged_array_2 |> Base.Array.every(fn (item) -> {item % 2 == 0})}
{merged_array_2 |> Base.Array.some(fn (item) -> {item < 0})}
{
Base.Array.make(6)
|> Base.Array.map(fn (item) -> item + 1)
|> Base.Array.reduce(0, fn (acc, item) -> item + acc)
}
</section>
}

0 comments on commit cb9ee05

Please sign in to comment.