about summary refs log tree commit diff stats
path: root/js/baba-yaga/scratch/baba/test_functional_enhancements.baba
blob: e8e922a48ba24e50f3a6ff6322e4243b8c3ae506 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Test file for new functional programming enhancements
// This file tests: scan operations, indexing operations, combinators, and flatMap

io.out "=== Testing Scan Operations ===";

// Test basic scan operation
numbers : [1, 2, 3, 4, 5];
addFunc : acc x -> acc + x;
scanned : scan addFunc 0 numbers;
io.out "scan (+) 0 [1,2,3,4,5]:";
io.out scanned; // Should be [0, 1, 3, 6, 10, 15]

// Test cumsum utility
cumsumResult : cumsum numbers;
io.out "cumsum [1,2,3,4,5]:";
io.out cumsumResult; // Should be [0, 1, 3, 6, 10, 15]

// Test cumprod utility
cumprodResult : cumprod numbers;
io.out "cumprod [1,2,3,4,5]:";
io.out cumprodResult; // Should be [1, 1, 2, 6, 24, 120]

io.out "=== Testing Array Indexing Operations ===";

data : [10, 21, 30, 43, 50];

// Test 'at' operation
indices : [0, 2, 4];
selected : at indices data;
io.out "at [0,2,4] [10,21,30,43,50]:";
io.out selected; // Should be [10, 30, 50]

// Test 'where' operation
evenPredicate : x -> x % 2 = 0;
evenIndices : where evenPredicate data;
io.out "where (even?) [10,21,30,43,50]:";
io.out evenIndices; // Should be [0, 2, 4] (indices of 10, 30, 50)

// Test 'take' operation
firstThree : take 3 data;
io.out "take 3 [10,21,30,43,50]:";
io.out firstThree; // Should be [10, 21, 30]

// Test 'drop' operation
lastTwo : drop 3 data;
io.out "drop 3 [10,21,30,43,50]:";
io.out lastTwo; // Should be [43, 50]

io.out "=== Testing Function Combinators ===";

// Test basic functions for combinators
add : x y -> x + y;
multiply : x y -> x * y;
double : x -> x * 2;
increment : x -> x + 1;

// Test flip
flippedAdd : flip add;
result1 : flippedAdd 3 5; // Should be 5 + 3 = 8
io.out "flip add 3 5:";
io.out result1;

// Test apply
result2 : apply double 7; // Should be 14
io.out "apply double 7:";
io.out result2;

// Test pipe
result3 : pipe 5 double; // Should be 10
io.out "pipe 5 double:";
io.out result3;

// Test compose
composed : compose increment double; // x -> (x * 2) + 1
result4 : composed 4; // Should be 9
io.out "compose increment double 4:";
io.out result4;

io.out "=== Testing flatMap ===";

// Test flatMap with simple function
duplicateFunc : x -> [x, x];
original : [1, 2, 3];
duplicated : flatMap duplicateFunc original;
io.out "flatMap (x -> [x,x]) [1,2,3]:";
io.out duplicated; // Should be [1, 1, 2, 2, 3, 3]

// Test flatMap with range generation
rangeFunc : x -> range 1 x;
rangeResult : flatMap rangeFunc [2, 3];
io.out "flatMap (x -> range 1 x) [2,3]:";
io.out rangeResult; // Should be [1, 2, 1, 2, 3]

io.out "=== Combining Operations ===";

// Complex example: Find cumulative sums of doubled even numbers
evenNumbers : [2, 4, 6, 8];
doubled : map double evenNumbers;
cumulative : cumsum doubled;
io.out "Cumsum of doubled evens [2,4,6,8]:";
io.out cumulative; // [0, 4, 12, 24, 40]

// Using combinators in a pipeline-like fashion
processNumber : x -> pipe x (compose increment double);
processed : map processNumber [1, 2, 3];
io.out "Map (pipe x (compose inc double)) [1,2,3]:";
io.out processed; // Should be [3, 5, 7]

io.out "=== Testing Broadcasting Operations ===";

// Test broadcast (scalar-array operation)
addOp : x y -> x + y;
numbers2 : [1, 2, 3, 4];
broadcasted : broadcast addOp 10 numbers2;
io.out "broadcast (+) 10 [1,2,3,4]:";
io.out broadcasted; // Should be [11, 12, 13, 14]

// Test zipWith (element-wise array-array operation)
array1 : [1, 2, 3];
array2 : [10, 20, 30];
zipped : zipWith addOp array1 array2;
io.out "zipWith (+) [1,2,3] [10,20,30]:";
io.out zipped; // Should be [11, 22, 33]

// Test reshape (2D matrix creation)
flatArray : [1, 2, 3, 4, 5, 6];
matrixShape : [2, 3]; // 2 rows, 3 columns
matrix : reshape matrixShape flatArray;
io.out "reshape [2,3] [1,2,3,4,5,6]:";
io.print matrix; // Should display as 2x3 matrix

io.out "=== All tests completed ===";