diff --git a/README.md b/README.md
index ca66c2e..e6fba15 100644
--- a/README.md
+++ b/README.md
@@ -5,3 +5,9 @@ Situs: https://lambda.fiako.engineering
Koleksi dan portal informasi lambda oleh FIAKO Engineering
Repository: [fiakoenjiniring/feidlambda](https://github.com/fiakoenjiniring/feidlambda)
+
+## QUARTO FILTER
+
+_Filter_ yang digunakan di website (quarto):
+
+- `include-code-files.lua` yang diperoleh dari [pandoc/lua-filters](https://github.com/pandoc/lua-filters/tree/master/include-code-files) dengan [MIT LICENSE](https://github.com/pandoc/lua-filters/blob/master/LICENSE),
\ No newline at end of file
diff --git a/_feidlambda/feid b/_feidlambda/feid
index 469710d..61bfaea 100644
--- a/_feidlambda/feid
+++ b/_feidlambda/feid
@@ -1,9 +1,9 @@
/*
-feidlambda v0.3.0 - LOGIC / UTILITIES FUNCTIONS BY FIAKO ENGINEERING
-GIST feidlambda v0.3.0: https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12
+feidlambda v0.3.1 - LOGIC / UTILITIES FUNCTIONS BY FIAKO ENGINEERING
+OFFICIAL GIST (feidlambda v0.3.x): https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12
REPOSITORY: https://github.com/fiakoenjiniring/feidlambda
AUTHOR: @taruma
-TESTED: Microsoft Excel v2211 (Build 16.0.15831.20098)
+TESTED: Microsoft Excel v2211
*/
/*
@@ -35,38 +35,69 @@ FILTER_DROP_COLUMNS = LAMBDA(array, column_index,
);
// NONE --> FILTER_FUNC_COLUMN
-FILTER_FUNC_COLUMN = LAMBDA(array, [col], [label_col], [with_label], [function], [label_function],
+FILTER_FUNC_COLUMN = LAMBDA(
+ array,
+ [column_index],
+ [with_label],
+ [label_col],
+ [function],
+ [label_function],
+ [take_first_only],
LET(
- col, IF(ISOMITTED(col), 1, col),
- label_col, IF(ISOMITTED(label_col), col, label_col),
+ take_first_only, IF(ISOMITTED(take_first_only), FALSE, take_first_only),
+ column_index, IF(ISOMITTED(column_index), 1, column_index),
+ label_col, IF(ISOMITTED(label_col), column_index, label_col),
with_label, IF(ISOMITTED(with_label), FALSE, with_label),
function, IF(ISOMITTED(function), LAMBDA(x, MAX(x)), function),
label_function, IF(ISOMITTED(label_function), "func", label_function),
- selected_vector, CHOOSECOLS(array, col),
+ selected_vector, CHOOSECOLS(array, column_index),
func_value, function(selected_vector),
selected_logical, selected_vector = func_value,
- array_max, FILTER(array, selected_logical),
- label, MAKEARRAY(ROWS(array_max), 1, LAMBDA(x, y, CONCAT(label_col, "_", label_function))),
- IF(with_label, HSTACK(label, array_max), array_max)
+ array_filter, FILTER(array, selected_logical),
+ array_func, IF(take_first_only, TAKE(array_filter, 1), array_filter),
+ label, MAKEARRAY(ROWS(array_func), 1, LAMBDA(x, y, CONCAT(label_col, "_", label_function))),
+ IF(with_label, HSTACK(label, array_func), array_func)
)
);
// FILTER_FUNC_COLUMN --> FILTER_MINMAX_COLUMN
-FILTER_MINMAX_COLUMN = LAMBDA(array, [col], [label_col], [with_label],
+FILTER_MINMAX_COLUMN = LAMBDA(array, [column_index], [with_label], [label_col], [take_first_only],
LET(
func_1, LAMBDA(x, MIN(x)),
label_func_1, "min",
func_2, LAMBDA(x, MAX(x)),
label_func_2, "max",
- func1_result, FILTER_FUNC_COLUMN(array, col, label_col, with_label, func_1, label_func_1),
- func2_result, FILTER_FUNC_COLUMN(array, col, label_col, with_label, func_2, label_func_2),
+ func1_result, FILTER_FUNC_COLUMN(
+ array,
+ column_index,
+ with_label,
+ label_col,
+ func_1,
+ label_func_1,
+ take_first_only
+ ),
+ func2_result, FILTER_FUNC_COLUMN(
+ array,
+ column_index,
+ with_label,
+ label_col,
+ func_2,
+ label_func_2,
+ take_first_only
+ ),
VSTACK(func1_result, func2_result)
)
);
// FILTER_MINMAX_COLUMN --> _RECURSIVE_FILTER_MINMAX
// _RECURSIVE_FILTER_MINMAX --> _RECURSIVE_FILTER_MINMAX
-_RECURSIVE_FILTER_MINMAX = LAMBDA(array, ntry, [ignore_first_column], [label_vector], [with_label],
+_RECURSIVE_FILTER_MINMAX = LAMBDA(
+ array,
+ ntry,
+ [ignore_first_column],
+ [with_label],
+ [label_vector],
+ [take_first_only],
LET(
ignore_first_column, IF(ISOMITTED(ignore_first_column), FALSE, ignore_first_column),
stop_col, IF(ignore_first_column, 2, 1),
@@ -75,17 +106,18 @@ _RECURSIVE_FILTER_MINMAX = LAMBDA(array, ntry, [ignore_first_column], [label_vec
label_col, CHOOSECOLS(new_label, ntry),
IF(
ntry = stop_col,
- FILTER_MINMAX_COLUMN(array, ntry, label_col, with_label),
+ FILTER_MINMAX_COLUMN(array, ntry, with_label, label_col, take_first_only),
LET(
- results, FILTER_MINMAX_COLUMN(array, ntry, label_col, with_label),
+ results, FILTER_MINMAX_COLUMN(array, ntry, with_label, label_col, take_first_only),
next_try, ntry - 1,
VSTACK(
_RECURSIVE_FILTER_MINMAX(
array,
next_try,
ignore_first_column,
+ with_label,
label_vector,
- with_label
+ take_first_only
),
results
)
@@ -95,8 +127,15 @@ _RECURSIVE_FILTER_MINMAX = LAMBDA(array, ntry, [ignore_first_column], [label_vec
);
// _RECURSIVE_FILTER_MINMAX --> FILTER_MINMAX_ARRAY
-FILTER_MINMAX_ARRAY = LAMBDA(array, [ignore_first_column], [with_labels], [label_vector],
- _RECURSIVE_FILTER_MINMAX(array, COLUMNS(array), ignore_first_column, label_vector, with_labels)
+FILTER_MINMAX_ARRAY = LAMBDA(array, [ignore_first_column], [with_label], [label_vector], [take_first_only],
+ _RECURSIVE_FILTER_MINMAX(
+ array,
+ COLUMNS(array),
+ ignore_first_column,
+ with_label,
+ label_vector,
+ take_first_only
+ )
);
/*
@@ -104,9 +143,9 @@ FILTER_MINMAX_ARRAY = LAMBDA(array, [ignore_first_column], [with_labels], [label
*/
// NONE --> GET_INDEX_2D
-GET_INDEX_2D = LAMBDA(lookup_value, array, [return_order_only],
+GET_INDEX_2D = LAMBDA(lookup_value, array, [return_as_order],
LET(
- return_order_only, IF(ISOMITTED(return_order_only), FALSE, return_order_only),
+ return_as_order, IF(ISOMITTED(return_as_order), FALSE, return_as_order),
nrows, ROWS(array),
ncols, COLUMNS(array),
size, nrows * ncols,
@@ -119,7 +158,7 @@ GET_INDEX_2D = LAMBDA(lookup_value, array, [return_order_only],
index_flatten, TOCOL(index_sequence, , TRUE),
lookup_table, HSTACK(index_flatten, rows_flatten, columns_flatten),
lookup_result, FILTER(lookup_table, array_flatten = lookup_value),
- IF(return_order_only, CHOOSECOLS(lookup_result, 1), lookup_result)
+ IF(return_as_order, CHOOSECOLS(lookup_result, 1), lookup_result)
)
);
@@ -197,21 +236,11 @@ _RECURSIVE_MAKE_SEQUENCE = LAMBDA(start_vector, end_vector, ntry, [stack_horizon
IF(
stack_horizontally,
HSTACK(
- _RECURSIVE_MAKE_SEQUENCE(
- start_vector,
- end_vector,
- next_try,
- stack_horizontally
- ),
+ _RECURSIVE_MAKE_SEQUENCE(start_vector, end_vector, next_try, stack_horizontally),
results
),
VSTACK(
- _RECURSIVE_MAKE_SEQUENCE(
- start_vector,
- end_vector,
- next_try,
- stack_horizontally
- ),
+ _RECURSIVE_MAKE_SEQUENCE(start_vector, end_vector, next_try, stack_horizontally),
results
)
)
@@ -234,11 +263,7 @@ REPEAT_ARRAY = LAMBDA(array, [num_repeat], [by_row],
LET(
by_row, IF(ISOMITTED(by_row), TRUE, by_row),
num_repeat, IF(ISOMITTED(num_repeat), 2, num_repeat),
- IF(
- by_row,
- REPEAT_ARRAY_BY_ROW(array, num_repeat),
- REPEAT_ARRAY_BY_COLUMN(array, num_repeat)
- )
+ IF(by_row, REPEAT_ARRAY_BY_ROW(array, num_repeat), REPEAT_ARRAY_BY_COLUMN(array, num_repeat))
)
);
@@ -261,10 +286,7 @@ REPEAT_ARRAY_BY_COLUMN = LAMBDA(array, [num_repeat],
IF(
num_repeat = 1,
array,
- LET(
- next_repeat, num_repeat - 1,
- HSTACK(REPEAT_ARRAY_BY_COLUMN(array, next_repeat), array)
- )
+ LET(next_repeat, num_repeat - 1, HSTACK(REPEAT_ARRAY_BY_COLUMN(array, next_repeat), array))
)
)
);
@@ -291,7 +313,7 @@ RESHAPE_BY_COLUMNS = LAMBDA(array, [num_split],
array_sorted, SORTBY(array_flatten, divider_repeat_col),
WRAPROWS(array_sorted, num_split)
),
- "#INVALID_NUM_SPLIT"
+ NA()
)
)
);
@@ -301,16 +323,16 @@ RESHAPE_BY_COLUMNS = LAMBDA(array, [num_split],
*/
// NONE --> ROTATE_VECTOR
-ROTATE_VECTOR = LAMBDA(vector, n, [as_column_vector],
+ROTATE_VECTOR = LAMBDA(vector, num_rotation, [as_column_vector],
LET(
vector, TOCOL(vector),
rotated_array, IFS(
- OR(n = 0, n >= ROWS(vector), n <= -ROWS(vector)),
+ OR(num_rotation = 0, num_rotation >= ROWS(vector), num_rotation <= -ROWS(vector)),
vector,
- n > 0,
- VSTACK(DROP(vector, n), TAKE(vector, n)),
- n < 0,
- VSTACK(TAKE(vector, n), DROP(vector, n))
+ num_rotation > 0,
+ VSTACK(DROP(vector, num_rotation), TAKE(vector, num_rotation)),
+ num_rotation < 0,
+ VSTACK(TAKE(vector, num_rotation), DROP(vector, num_rotation))
),
as_column_vector, IF(ISOMITTED(as_column_vector), FALSE, TRUE),
IF(as_column_vector, TOROW(rotated_array), TOCOL(rotated_array))
@@ -318,7 +340,7 @@ ROTATE_VECTOR = LAMBDA(vector, n, [as_column_vector],
);
// ROTATE_VECTOR --> ROTATE_ARRAY
-ROTATE_ARRAY = LAMBDA(array, n, [rotate_columns],
+ROTATE_ARRAY = LAMBDA(array, num_rotation, [rotate_columns],
LET(
rotate_columns, IF(ISOMITTED(rotate_columns), TRUE, FALSE),
nrows, ROWS(array),
@@ -327,8 +349,8 @@ ROTATE_ARRAY = LAMBDA(array, n, [rotate_columns],
seqcols, SEQUENCE(1, ncols),
results, IF(
rotate_columns,
- CHOOSECOLS(array, ROTATE_VECTOR(seqcols, n, TRUE)),
- CHOOSEROWS(array, ROTATE_VECTOR(seqrows, n, FALSE))
+ CHOOSECOLS(array, ROTATE_VECTOR(seqcols, num_rotation, TRUE)),
+ CHOOSEROWS(array, ROTATE_VECTOR(seqrows, num_rotation, FALSE))
),
results
)
@@ -341,13 +363,16 @@ ROTATE_ARRAY = LAMBDA(array, n, [rotate_columns],
// NONE --> SWAP_COLUMNS
SWAP_COLUMNS = LAMBDA(array, [from_index], [to_index],
LET(
+ ncols, COLUMNS(array),
from_index, IF(ISOMITTED(from_index), 1, from_index),
- to_index, IF(ISOMITTED(to_index), 2, to_index),
+ to_index, IF(ISOMITTED(to_index), -1, to_index),
+ from_value, IF(from_index < 0, from_index + ncols + 1, from_index),
+ to_value, IF(to_index < 0, to_index + ncols + 1, to_index),
column_sequence, SEQUENCE(1, COLUMNS(array)),
- from_logical, column_sequence = from_index,
- to_logical, column_sequence = to_index,
- replace_from, IF(from_logical, to_index, column_sequence),
- replace_to, IF(to_logical, from_index, replace_from),
+ from_logical, column_sequence = from_value,
+ to_logical, column_sequence = to_value,
+ replace_from, IF(from_logical, to_value, column_sequence),
+ replace_to, IF(to_logical, from_value, replace_from),
CHOOSECOLS(array, replace_to)
)
);
@@ -355,13 +380,16 @@ SWAP_COLUMNS = LAMBDA(array, [from_index], [to_index],
// NONE --> SWAP_ROWS
SWAP_ROWS = LAMBDA(array, [from_index], [to_index],
LET(
+ nrows, ROWS(array),
from_index, IF(ISOMITTED(from_index), 1, from_index),
- to_index, IF(ISOMITTED(to_index), 2, to_index),
+ to_index, IF(ISOMITTED(to_index), -1, to_index),
+ from_value, IF(from_index < 0, from_index + nrows + 1, from_index),
+ to_value, IF(to_index < 0, to_index + nrows + 1, to_index),
row_sequence, SEQUENCE(ROWS(array)),
- from_logical, row_sequence = from_index,
- to_logical, row_sequence = to_index,
- replace_from, IF(from_logical, to_index, row_sequence),
- replace_to, IF(to_logical, from_index, replace_from),
+ from_logical, row_sequence = from_value,
+ to_logical, row_sequence = to_value,
+ replace_from, IF(from_logical, to_value, row_sequence),
+ replace_to, IF(to_logical, from_value, replace_from),
CHOOSEROWS(array, replace_to)
)
);
@@ -370,20 +398,72 @@ SWAP_ROWS = LAMBDA(array, [from_index], [to_index],
---- TEXT ----
*/
-// NONE --> TEXT_SPLIT_VECTOR
+// _RECURSIVE_TEXT_SPLIT --> _RECURSIVE_TEXT_SPLIT
+_RECURSIVE_TEXT_SPLIT = LAMBDA(
+ text_vector,
+ ntry,
+ col_delimiter,
+ [row_delimiter],
+ [ignore_empty],
+ [match_mode],
+ [pad_with],
+ LET(
+ text_vector, TOCOL(text_vector),
+ selected_row, ARRAYTOTEXT(INDEX(text_vector, ntry)),
+ IF(
+ ntry = 1,
+ TEXTSPLIT(selected_row, col_delimiter, row_delimiter, ignore_empty, match_mode, pad_with),
+ LET(
+ next_try, ntry - 1,
+ results, TEXTSPLIT(
+ selected_row,
+ col_delimiter,
+ row_delimiter,
+ ignore_empty,
+ match_mode,
+ pad_with
+ ),
+ VSTACK(
+ _RECURSIVE_TEXT_SPLIT(
+ text_vector,
+ next_try,
+ col_delimiter,
+ row_delimiter,
+ ignore_empty,
+ match_mode,
+ pad_with
+ ),
+ results
+ )
+ )
+ )
+ )
+);
+
+// _RECURSIVE_TEXT_SPLIT --> TEXT_SPLIT_VECTOR
TEXT_SPLIT_VECTOR = LAMBDA(
text_vector,
- [text_delimiter],
+ [col_delimiter],
[row_delimiter],
[ignore_empty],
[match_mode],
[pad_with],
+ [replace_na],
LET(
- text_delimiter, IF(ISOMITTED(text_delimiter), " ", text_delimiter),
- row_delimiter, IF(ISOMITTED(row_delimiter), "|<#>|", row_delimiter),
+ nrows, ROWS(text_vector),
+ col_delimiter, IF(ISOMITTED(col_delimiter), " ", col_delimiter),
+ replace_na, IF(ISOMITTED(replace_na), NA(), replace_na),
pad_with, IF(ISOMITTED(pad_with), "", pad_with),
- reduce_text, REDUCE(, text_vector, LAMBDA(acc, curr, CONCAT(acc, row_delimiter, curr))),
- TEXTSPLIT(reduce_text, text_delimiter, row_delimiter, ignore_empty, match_mode, pad_with)
+ result, _RECURSIVE_TEXT_SPLIT(
+ text_vector,
+ nrows,
+ col_delimiter,
+ row_delimiter,
+ ignore_empty,
+ match_mode,
+ pad_with
+ ),
+ IFERROR(result, replace_na)
)
);
diff --git a/_feidlambda/feid_FILTER b/_feidlambda/feid_FILTER
index d86bdff..6b8edfb 100644
--- a/_feidlambda/feid_FILTER
+++ b/_feidlambda/feid_FILTER
@@ -23,38 +23,69 @@ FILTER_DROP_COLUMNS = LAMBDA(array, column_index,
);
// NONE --> FILTER_FUNC_COLUMN
-FILTER_FUNC_COLUMN = LAMBDA(array, [col], [label_col], [with_label], [function], [label_function],
+FILTER_FUNC_COLUMN = LAMBDA(
+ array,
+ [column_index],
+ [with_label],
+ [label_col],
+ [function],
+ [label_function],
+ [take_first_only],
LET(
- col, IF(ISOMITTED(col), 1, col),
- label_col, IF(ISOMITTED(label_col), col, label_col),
+ take_first_only, IF(ISOMITTED(take_first_only), FALSE, take_first_only),
+ column_index, IF(ISOMITTED(column_index), 1, column_index),
+ label_col, IF(ISOMITTED(label_col), column_index, label_col),
with_label, IF(ISOMITTED(with_label), FALSE, with_label),
function, IF(ISOMITTED(function), LAMBDA(x, MAX(x)), function),
label_function, IF(ISOMITTED(label_function), "func", label_function),
- selected_vector, CHOOSECOLS(array, col),
+ selected_vector, CHOOSECOLS(array, column_index),
func_value, function(selected_vector),
selected_logical, selected_vector = func_value,
- array_max, FILTER(array, selected_logical),
- label, MAKEARRAY(ROWS(array_max), 1, LAMBDA(x, y, CONCAT(label_col, "_", label_function))),
- IF(with_label, HSTACK(label, array_max), array_max)
+ array_filter, FILTER(array, selected_logical),
+ array_func, IF(take_first_only, TAKE(array_filter, 1), array_filter),
+ label, MAKEARRAY(ROWS(array_func), 1, LAMBDA(x, y, CONCAT(label_col, "_", label_function))),
+ IF(with_label, HSTACK(label, array_func), array_func)
)
);
// FILTER_FUNC_COLUMN --> FILTER_MINMAX_COLUMN
-FILTER_MINMAX_COLUMN = LAMBDA(array, [col], [label_col], [with_label],
+FILTER_MINMAX_COLUMN = LAMBDA(array, [column_index], [with_label], [label_col], [take_first_only],
LET(
func_1, LAMBDA(x, MIN(x)),
label_func_1, "min",
func_2, LAMBDA(x, MAX(x)),
label_func_2, "max",
- func1_result, FILTER_FUNC_COLUMN(array, col, label_col, with_label, func_1, label_func_1),
- func2_result, FILTER_FUNC_COLUMN(array, col, label_col, with_label, func_2, label_func_2),
+ func1_result, FILTER_FUNC_COLUMN(
+ array,
+ column_index,
+ with_label,
+ label_col,
+ func_1,
+ label_func_1,
+ take_first_only
+ ),
+ func2_result, FILTER_FUNC_COLUMN(
+ array,
+ column_index,
+ with_label,
+ label_col,
+ func_2,
+ label_func_2,
+ take_first_only
+ ),
VSTACK(func1_result, func2_result)
)
);
// FILTER_MINMAX_COLUMN --> _RECURSIVE_FILTER_MINMAX
// _RECURSIVE_FILTER_MINMAX --> _RECURSIVE_FILTER_MINMAX
-_RECURSIVE_FILTER_MINMAX = LAMBDA(array, ntry, [ignore_first_column], [label_vector], [with_label],
+_RECURSIVE_FILTER_MINMAX = LAMBDA(
+ array,
+ ntry,
+ [ignore_first_column],
+ [with_label],
+ [label_vector],
+ [take_first_only],
LET(
ignore_first_column, IF(ISOMITTED(ignore_first_column), FALSE, ignore_first_column),
stop_col, IF(ignore_first_column, 2, 1),
@@ -63,17 +94,18 @@ _RECURSIVE_FILTER_MINMAX = LAMBDA(array, ntry, [ignore_first_column], [label_vec
label_col, CHOOSECOLS(new_label, ntry),
IF(
ntry = stop_col,
- FILTER_MINMAX_COLUMN(array, ntry, label_col, with_label),
+ FILTER_MINMAX_COLUMN(array, ntry, with_label, label_col, take_first_only),
LET(
- results, FILTER_MINMAX_COLUMN(array, ntry, label_col, with_label),
+ results, FILTER_MINMAX_COLUMN(array, ntry, with_label, label_col, take_first_only),
next_try, ntry - 1,
VSTACK(
_RECURSIVE_FILTER_MINMAX(
array,
next_try,
ignore_first_column,
+ with_label,
label_vector,
- with_label
+ take_first_only
),
results
)
@@ -83,6 +115,13 @@ _RECURSIVE_FILTER_MINMAX = LAMBDA(array, ntry, [ignore_first_column], [label_vec
);
// _RECURSIVE_FILTER_MINMAX --> FILTER_MINMAX_ARRAY
-FILTER_MINMAX_ARRAY = LAMBDA(array, [ignore_first_column], [with_labels], [label_vector],
- _RECURSIVE_FILTER_MINMAX(array, COLUMNS(array), ignore_first_column, label_vector, with_labels)
-);
\ No newline at end of file
+FILTER_MINMAX_ARRAY = LAMBDA(array, [ignore_first_column], [with_label], [label_vector], [take_first_only],
+ _RECURSIVE_FILTER_MINMAX(
+ array,
+ COLUMNS(array),
+ ignore_first_column,
+ with_label,
+ label_vector,
+ take_first_only
+ )
+);
diff --git a/_feidlambda/feid_GET b/_feidlambda/feid_GET
index 5c24d41..0046d46 100644
--- a/_feidlambda/feid_GET
+++ b/_feidlambda/feid_GET
@@ -1,7 +1,7 @@
// NONE --> GET_INDEX_2D
-GET_INDEX_2D = LAMBDA(lookup_value, array, [return_order_only],
+GET_INDEX_2D = LAMBDA(lookup_value, array, [return_as_order],
LET(
- return_order_only, IF(ISOMITTED(return_order_only), FALSE, return_order_only),
+ return_as_order, IF(ISOMITTED(return_as_order), FALSE, return_as_order),
nrows, ROWS(array),
ncols, COLUMNS(array),
size, nrows * ncols,
@@ -14,6 +14,6 @@ GET_INDEX_2D = LAMBDA(lookup_value, array, [return_order_only],
index_flatten, TOCOL(index_sequence, , TRUE),
lookup_table, HSTACK(index_flatten, rows_flatten, columns_flatten),
lookup_result, FILTER(lookup_table, array_flatten = lookup_value),
- IF(return_order_only, CHOOSECOLS(lookup_result, 1), lookup_result)
+ IF(return_as_order, CHOOSECOLS(lookup_result, 1), lookup_result)
)
-);
\ No newline at end of file
+);
diff --git a/_feidlambda/feid_IS b/_feidlambda/feid_IS
index 2fa65a9..f9609a9 100644
--- a/_feidlambda/feid_IS
+++ b/_feidlambda/feid_IS
@@ -47,4 +47,4 @@ IS_COLUMNS_LOGICAL = LAMBDA(logical_array, [logical_function],
logical_function, IF(ISOMITTED(logical_function), LAMBDA(x, OR(x)), logical_function),
BYCOL(logical_array, LAMBDA(each_col, logical_function(each_col)))
)
-);
\ No newline at end of file
+);
diff --git a/_feidlambda/feid_MAKE b/_feidlambda/feid_MAKE
index b1db5dc..bdef3be 100644
--- a/_feidlambda/feid_MAKE
+++ b/_feidlambda/feid_MAKE
@@ -13,21 +13,11 @@ _RECURSIVE_MAKE_SEQUENCE = LAMBDA(start_vector, end_vector, ntry, [stack_horizon
IF(
stack_horizontally,
HSTACK(
- _RECURSIVE_MAKE_SEQUENCE(
- start_vector,
- end_vector,
- next_try,
- stack_horizontally
- ),
+ _RECURSIVE_MAKE_SEQUENCE(start_vector, end_vector, next_try, stack_horizontally),
results
),
VSTACK(
- _RECURSIVE_MAKE_SEQUENCE(
- start_vector,
- end_vector,
- next_try,
- stack_horizontally
- ),
+ _RECURSIVE_MAKE_SEQUENCE(start_vector, end_vector, next_try, stack_horizontally),
results
)
)
@@ -39,4 +29,4 @@ _RECURSIVE_MAKE_SEQUENCE = LAMBDA(start_vector, end_vector, ntry, [stack_horizon
// _RECURSIVE_MAKE_SEQUENCE --> MAKE_SEQUENCE_FROM_VECTOR
MAKE_SEQUENCE_FROM_VECTOR = LAMBDA(start_vector, end_vector, [stack_horizontally],
_RECURSIVE_MAKE_SEQUENCE(start_vector, end_vector, ROWS(start_vector), stack_horizontally)
-);
\ No newline at end of file
+);
diff --git a/_feidlambda/feid_REPEAT b/_feidlambda/feid_REPEAT
index 2bc9541..621c0ee 100644
--- a/_feidlambda/feid_REPEAT
+++ b/_feidlambda/feid_REPEAT
@@ -3,11 +3,7 @@ REPEAT_ARRAY = LAMBDA(array, [num_repeat], [by_row],
LET(
by_row, IF(ISOMITTED(by_row), TRUE, by_row),
num_repeat, IF(ISOMITTED(num_repeat), 2, num_repeat),
- IF(
- by_row,
- REPEAT_ARRAY_BY_ROW(array, num_repeat),
- REPEAT_ARRAY_BY_COLUMN(array, num_repeat)
- )
+ IF(by_row, REPEAT_ARRAY_BY_ROW(array, num_repeat), REPEAT_ARRAY_BY_COLUMN(array, num_repeat))
)
);
@@ -30,10 +26,7 @@ REPEAT_ARRAY_BY_COLUMN = LAMBDA(array, [num_repeat],
IF(
num_repeat = 1,
array,
- LET(
- next_repeat, num_repeat - 1,
- HSTACK(REPEAT_ARRAY_BY_COLUMN(array, next_repeat), array)
- )
+ LET(next_repeat, num_repeat - 1, HSTACK(REPEAT_ARRAY_BY_COLUMN(array, next_repeat), array))
)
)
-);
+);
\ No newline at end of file
diff --git a/_feidlambda/feid_RESHAPE b/_feidlambda/feid_RESHAPE
index 8962928..b9afefc 100644
--- a/_feidlambda/feid_RESHAPE
+++ b/_feidlambda/feid_RESHAPE
@@ -16,7 +16,7 @@ RESHAPE_BY_COLUMNS = LAMBDA(array, [num_split],
array_sorted, SORTBY(array_flatten, divider_repeat_col),
WRAPROWS(array_sorted, num_split)
),
- "#INVALID_NUM_SPLIT"
+ NA()
)
)
-);
\ No newline at end of file
+);
diff --git a/_feidlambda/feid_ROTATE b/_feidlambda/feid_ROTATE
index 52d219d..c622d04 100644
--- a/_feidlambda/feid_ROTATE
+++ b/_feidlambda/feid_ROTATE
@@ -1,14 +1,14 @@
// NONE --> ROTATE_VECTOR
-ROTATE_VECTOR = LAMBDA(vector, n, [as_column_vector],
+ROTATE_VECTOR = LAMBDA(vector, num_rotation, [as_column_vector],
LET(
vector, TOCOL(vector),
rotated_array, IFS(
- OR(n = 0, n >= ROWS(vector), n <= -ROWS(vector)),
+ OR(num_rotation = 0, num_rotation >= ROWS(vector), num_rotation <= -ROWS(vector)),
vector,
- n > 0,
- VSTACK(DROP(vector, n), TAKE(vector, n)),
- n < 0,
- VSTACK(TAKE(vector, n), DROP(vector, n))
+ num_rotation > 0,
+ VSTACK(DROP(vector, num_rotation), TAKE(vector, num_rotation)),
+ num_rotation < 0,
+ VSTACK(TAKE(vector, num_rotation), DROP(vector, num_rotation))
),
as_column_vector, IF(ISOMITTED(as_column_vector), FALSE, TRUE),
IF(as_column_vector, TOROW(rotated_array), TOCOL(rotated_array))
@@ -16,7 +16,7 @@ ROTATE_VECTOR = LAMBDA(vector, n, [as_column_vector],
);
// ROTATE_VECTOR --> ROTATE_ARRAY
-ROTATE_ARRAY = LAMBDA(array, n, [rotate_columns],
+ROTATE_ARRAY = LAMBDA(array, num_rotation, [rotate_columns],
LET(
rotate_columns, IF(ISOMITTED(rotate_columns), TRUE, FALSE),
nrows, ROWS(array),
@@ -25,9 +25,9 @@ ROTATE_ARRAY = LAMBDA(array, n, [rotate_columns],
seqcols, SEQUENCE(1, ncols),
results, IF(
rotate_columns,
- CHOOSECOLS(array, ROTATE_VECTOR(seqcols, n, TRUE)),
- CHOOSEROWS(array, ROTATE_VECTOR(seqrows, n, FALSE))
+ CHOOSECOLS(array, ROTATE_VECTOR(seqcols, num_rotation, TRUE)),
+ CHOOSEROWS(array, ROTATE_VECTOR(seqrows, num_rotation, FALSE))
),
results
)
-);
\ No newline at end of file
+);
diff --git a/_feidlambda/feid_SWAP b/_feidlambda/feid_SWAP
index 5434d22..09f9e09 100644
--- a/_feidlambda/feid_SWAP
+++ b/_feidlambda/feid_SWAP
@@ -1,13 +1,16 @@
// NONE --> SWAP_COLUMNS
SWAP_COLUMNS = LAMBDA(array, [from_index], [to_index],
LET(
+ ncols, COLUMNS(array),
from_index, IF(ISOMITTED(from_index), 1, from_index),
- to_index, IF(ISOMITTED(to_index), 2, to_index),
+ to_index, IF(ISOMITTED(to_index), -1, to_index),
+ from_value, IF(from_index < 0, from_index + ncols + 1, from_index),
+ to_value, IF(to_index < 0, to_index + ncols + 1, to_index),
column_sequence, SEQUENCE(1, COLUMNS(array)),
- from_logical, column_sequence = from_index,
- to_logical, column_sequence = to_index,
- replace_from, IF(from_logical, to_index, column_sequence),
- replace_to, IF(to_logical, from_index, replace_from),
+ from_logical, column_sequence = from_value,
+ to_logical, column_sequence = to_value,
+ replace_from, IF(from_logical, to_value, column_sequence),
+ replace_to, IF(to_logical, from_value, replace_from),
CHOOSECOLS(array, replace_to)
)
);
@@ -15,13 +18,16 @@ SWAP_COLUMNS = LAMBDA(array, [from_index], [to_index],
// NONE --> SWAP_ROWS
SWAP_ROWS = LAMBDA(array, [from_index], [to_index],
LET(
+ nrows, ROWS(array),
from_index, IF(ISOMITTED(from_index), 1, from_index),
- to_index, IF(ISOMITTED(to_index), 2, to_index),
+ to_index, IF(ISOMITTED(to_index), -1, to_index),
+ from_value, IF(from_index < 0, from_index + nrows + 1, from_index),
+ to_value, IF(to_index < 0, to_index + nrows + 1, to_index),
row_sequence, SEQUENCE(ROWS(array)),
- from_logical, row_sequence = from_index,
- to_logical, row_sequence = to_index,
- replace_from, IF(from_logical, to_index, row_sequence),
- replace_to, IF(to_logical, from_index, replace_from),
+ from_logical, row_sequence = from_value,
+ to_logical, row_sequence = to_value,
+ replace_from, IF(from_logical, to_value, row_sequence),
+ replace_to, IF(to_logical, from_value, replace_from),
CHOOSEROWS(array, replace_to)
)
-);
\ No newline at end of file
+);
diff --git a/_feidlambda/feid_TEXT b/_feidlambda/feid_TEXT
index e907965..e84e033 100644
--- a/_feidlambda/feid_TEXT
+++ b/_feidlambda/feid_TEXT
@@ -1,16 +1,68 @@
-// NONE --> TEXT_SPLIT_VECTOR
+// _RECURSIVE_TEXT_SPLIT --> _RECURSIVE_TEXT_SPLIT
+_RECURSIVE_TEXT_SPLIT = LAMBDA(
+ text_vector,
+ ntry,
+ col_delimiter,
+ [row_delimiter],
+ [ignore_empty],
+ [match_mode],
+ [pad_with],
+ LET(
+ text_vector, TOCOL(text_vector),
+ selected_row, ARRAYTOTEXT(INDEX(text_vector, ntry)),
+ IF(
+ ntry = 1,
+ TEXTSPLIT(selected_row, col_delimiter, row_delimiter, ignore_empty, match_mode, pad_with),
+ LET(
+ next_try, ntry - 1,
+ results, TEXTSPLIT(
+ selected_row,
+ col_delimiter,
+ row_delimiter,
+ ignore_empty,
+ match_mode,
+ pad_with
+ ),
+ VSTACK(
+ _RECURSIVE_TEXT_SPLIT(
+ text_vector,
+ next_try,
+ col_delimiter,
+ row_delimiter,
+ ignore_empty,
+ match_mode,
+ pad_with
+ ),
+ results
+ )
+ )
+ )
+ )
+);
+
+// _RECURSIVE_TEXT_SPLIT --> TEXT_SPLIT_VECTOR
TEXT_SPLIT_VECTOR = LAMBDA(
text_vector,
- [text_delimiter],
+ [col_delimiter],
[row_delimiter],
[ignore_empty],
[match_mode],
[pad_with],
+ [replace_na],
LET(
- text_delimiter, IF(ISOMITTED(text_delimiter), " ", text_delimiter),
- row_delimiter, IF(ISOMITTED(row_delimiter), "|<#>|", row_delimiter),
+ nrows, ROWS(text_vector),
+ col_delimiter, IF(ISOMITTED(col_delimiter), " ", col_delimiter),
+ replace_na, IF(ISOMITTED(replace_na), NA(), replace_na),
pad_with, IF(ISOMITTED(pad_with), "", pad_with),
- reduce_text, REDUCE(, text_vector, LAMBDA(acc, curr, CONCAT(acc, row_delimiter, curr))),
- TEXTSPLIT(reduce_text, text_delimiter, row_delimiter, ignore_empty, match_mode, pad_with)
+ result, _RECURSIVE_TEXT_SPLIT(
+ text_vector,
+ nrows,
+ col_delimiter,
+ row_delimiter,
+ ignore_empty,
+ match_mode,
+ pad_with
+ ),
+ IFERROR(result, replace_na)
)
-);
\ No newline at end of file
+);
diff --git a/_quarto.yml b/_quarto.yml
index f213e96..2f91186 100644
--- a/_quarto.yml
+++ b/_quarto.yml
@@ -22,8 +22,8 @@ website:
# FOR TWITTER / open-graph
- image: "fiakologo.png"
- favicon: "fiakologo.png"
+ image: /assets/original_feidlambda_logo.png
+ favicon: /assets/original_feidlambda_logo.png
## NAVIGATION BAR
navbar:
@@ -34,35 +34,24 @@ website:
collapse: true
- logo: "fiakologo.png"
+ logo: /assets/original_feidlambda_logo.png
left:
- text: Home
href: index.qmd
- - text: Dokumentasi
- menu:
- - href: docs/penggunaan.qmd
- - href: docs/glossary.qmd
- - text: feidlambda 0.x
+ - text: feidlambda
menu:
- - href: release/feidlambda.qmd
- - href: release/migration-v0-2-to-v0-3.qmd
- - href: release/feidlambda-0-3-0.qmd
+ - href: release/source-code.qmd
+ - href: release/feidlambda-0-3.qmd
- href: release/feidlambda-0-2-0.qmd
- href: release/feidlambda-0-1-0.qmd
- - text: Greenhorn
+ - text: Dokumentasi
menu:
- - text: "Greenhorn"
- href: greenhorn/index.qmd
- - text: feidlambda I
- href: greenhorn/index.qmd
- # href: greenhorn/feidlambda-2/presentation.qmd
- - text: feidlambda II
- href: greenhorn/feidlambda-2/index.qmd
- - text: feidlambda III
- href: greenhorn/index.qmd
- # href: release/feidlambda-0-1-0.qmd
-
+ - href: docs/install.qmd
+ - href: docs/glossary.qmd
+ - text: Artikel
+ menu:
+ - href: article/migration-v0-2-to-v0-3.qmd
right:
- icon: github
@@ -74,7 +63,7 @@ website:
contents:
- section: "Dokumentasi"
contents:
- - href: docs/penggunaan.qmd
+ - href: docs/install.qmd
- href: docs/glossary.qmd
- id: side-feidlambda
@@ -117,11 +106,9 @@ website:
## SIDEBAR
page-footer:
right: >-
- developed by **fiako**dev.
- built with ❤️ and [Quarto](https://quarto.org/).
+ developed by **fiako**dev
left: >-
- © 2022 PT. FIAKO ENJINIRING INDONESIA.
- CC-BY-NC-SA 4.0.
+ © 2022-2023 PT. FIAKO ENJINIRING INDONESIA
format:
html:
diff --git a/release/migration-v0-2-to-v0-3.qmd b/article/migration-v0-2-to-v0-3.qmd
similarity index 99%
rename from release/migration-v0-2-to-v0-3.qmd
rename to article/migration-v0-2-to-v0-3.qmd
index 8b74867..291a152 100644
--- a/release/migration-v0-2-to-v0-3.qmd
+++ b/article/migration-v0-2-to-v0-3.qmd
@@ -14,6 +14,9 @@ number-sections: false
number-offset: [0, 0]
link-external-newwindow: true
+aliases:
+ - /release/migration-v0-2-to-v0-3.html
+
---
Halaman ini menjelaskan mengenai perubahan feidlambda v0.2 ke v0.3 dan panduan migrasinya.
diff --git a/assets/original_feidlambda.png b/assets/original_feidlambda.png
new file mode 100644
index 0000000..8021dfc
Binary files /dev/null and b/assets/original_feidlambda.png differ
diff --git a/assets/original_feidlambda_logo.png b/assets/original_feidlambda_logo.png
new file mode 100644
index 0000000..37b333a
Binary files /dev/null and b/assets/original_feidlambda_logo.png differ
diff --git a/docs/penggunaan.qmd b/docs/install.qmd
similarity index 78%
rename from docs/penggunaan.qmd
rename to docs/install.qmd
index 0bfa268..cec9929 100644
--- a/docs/penggunaan.qmd
+++ b/docs/install.qmd
@@ -15,9 +15,13 @@ number-sections: true
link-external-newwindow: true
layout: article
sidebar: side-docs
+
+aliases:
+ - penggunaan.html
+
---
-Panduan ini untuk __Advanced Formula Environment__ v1.1. Panduan versi sebelumnya (v1.0) bisa dilihat [disini](penggunaan-v1.qmd).
+Panduan ini untuk __Advanced Formula Environment__ v1.1.
## **Advanced Formula Environment**
@@ -38,7 +42,11 @@ Setelah AFE terpasang di Microsoft Excel, lakukan _import_ dengan membuka AFE me
## Salin _Github Gist URL_
-Isi "Github Gist URL" dengan link koleksi lambda yang tersedia ([Link Github Gist feidlambda v0.3](https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12)). _Checklist_ ✅ bagian "_Add formulas to new module_" dan isi nama _module_ dengan nama koleksi (contoh: `feid`).
+Isi "Github Gist URL" dengan link koleksi lambda yang tersedia. _Checklist_ ✅ bagian "_Add formulas to new module_" dan isi nama _module_ dengan nama koleksi (contoh: `feid`). Berikut link feidlambda v0.3.x:
+
+```default
+https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12
+```

@@ -58,6 +66,6 @@ Selesai _save_, fungsi **feidlambda** bisa langsung digunakan.
## Baca dokumentasi **feidlambda** v0.3
-Dokumentasi feidlambda v0.3 bisa baca di halaman [feidlambda v0.3](/release/feidlambda-0-3-0.qmd). Dan panduan migrasi bisa baca di halaman [Migrasi feidlambda v0.2 ke v0.3](/release/migration-v0-2-to-v0-3.qmd).
+Dokumentasi feidlambda v0.3 bisa baca di halaman [feidlambda v0.3](/release/feidlambda-0-3.qmd). Dan panduan migrasi bisa baca di halaman [Migrasi feidlambda v0.2 ke v0.3](/article/migration-v0-2-to-v0-3.qmd).
Jangan lupa juga untuk membaca [Daftar istilah](/docs/glossary.qmd) yang digunakan dalam pada dokumentasi dan pengembangan feidlambda.
\ No newline at end of file
diff --git a/fiakologo.png b/fiakologo.png
deleted file mode 100644
index 8b716f3..0000000
Binary files a/fiakologo.png and /dev/null differ
diff --git a/index.qmd b/index.qmd
index 4192143..2e8d1f4 100644
--- a/index.qmd
+++ b/index.qmd
@@ -9,21 +9,44 @@ page-layout: full
sidebar: false
---
-::: {.text-center .m-0}
-# $\text{fe}\hat{i}\text{d} \textbf{l} \lambda \text{m} \textsf{b} \texttt{d} \bigtriangleup$
+::: {.text-center}
+{width="300"}
:::
-::: {.text-center .callout-important appearance="simple" icon="false"}
-## Dalam Pengembangan
+::: {.text-center .mb-4}
+
+{height=25}
+{height=25}
+{height=25}
+{height=25}
-Saat ini `feidlambda` (koleksi LAMBDA) masih dalam tahap pengembangan. Untuk lebih jelasnya bisa membaca [Public Roadmap fiakodev Q4 2022](https://dev.fiako.engineering/logs/public-roadmap-october-2022).
:::
-::: {.callout-tip icon="false" .text-center}
-## Official GIST **feidlambda**
+::: {.text-center}
+
+[](/docs/install.qmd)
+[](/release/feidlambda-0-3.qmd)
+[](/release/source-code.qmd)
+[](https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12)
+
+### OFFICAL GIST URL (feidlambda v0.3.x)
+
+```default
+https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12
+```
+
+:::
-#### [GIST feidlambda v0.3](https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12)
+::: {.text-center .callout-tip appearance="minimal"}
+## **STATUS PENGEMBANGAN**
---
-[v0.3](release/feidlambda-0-3-0.qmd) | [v0.2](release/feidlambda-0-2-0.qmd) | [v0.1](release/feidlambda-0-1-0.qmd) | [panduan](docs/penggunaan.qmd) | [source code](release/feidlambda.qmd)
-:::
\ No newline at end of file
+
+**feidlambda v0.3** sudah siap digunakan oleh publik. Dengan catatan masih banyak yang perlu dipelajari, perbaiki, dan dikembangkan sehingga status feidlambda masih bersifat **eksperimental**.
+
+:::
+
+::: {.text-center .callout-warning appearance="minimal"}
+Halaman *greenhorn* untuk sementara tidak tersedia di _navigation bar_. Untuk mengakses presentasi bisa mengunjungi [link ini](/greenhorn/feidlambda-2/presentation.qmd){target="_blank"}.
+:::
+
diff --git a/release/excel/RELEASE_feidlambda_v0_3_1.xlsx b/release/excel/RELEASE_feidlambda_v0_3_1.xlsx
new file mode 100644
index 0000000..b596841
Binary files /dev/null and b/release/excel/RELEASE_feidlambda_v0_3_1.xlsx differ
diff --git a/release/feidlambda-0-1-0.qmd b/release/feidlambda-0-1-0.qmd
index 3c0b09e..bf7528e 100644
--- a/release/feidlambda-0-1-0.qmd
+++ b/release/feidlambda-0-1-0.qmd
@@ -1,6 +1,6 @@
---
title: |
- feidlambda 0.1.0
+ feidlambda v0.1
subtitle: |
Fitur terbaru di `feidlambda v0.1.0`
author: "Taruma Sakti Megariansyah"
diff --git a/release/feidlambda-0-2-0.qmd b/release/feidlambda-0-2-0.qmd
index fc4782f..a14935e 100644
--- a/release/feidlambda-0-2-0.qmd
+++ b/release/feidlambda-0-2-0.qmd
@@ -1,6 +1,6 @@
---
title: |
- feidlambda 0.2.0
+ feidlambda v0.2
subtitle: |
Fitur terbaru di `feidlambda v0.2.0`
author: "Taruma Sakti Megariansyah"
diff --git a/release/feidlambda-0-3-0.qmd b/release/feidlambda-0-3.qmd
similarity index 71%
rename from release/feidlambda-0-3-0.qmd
rename to release/feidlambda-0-3.qmd
index f4f255a..17412d4 100644
--- a/release/feidlambda-0-3-0.qmd
+++ b/release/feidlambda-0-3.qmd
@@ -1,11 +1,11 @@
---
title: |
- feidlambda v0.3
+ feidlambda v0.3.1
subtitle: |
- Koleksi LAMBDA feidlambda v0.3
+ Koleksi LAMBDA feidlambda v0.3.1
author: "Taruma Sakti Megariansyah"
-date: 2022-12-28
-date-modified: 2023-01-06
+date: 2023-01-06
+date-modified: 2023-01-13
date-format: full
lang: id
@@ -26,15 +26,25 @@ format:
crossref:
chapters: true
+
+aliases:
+ - feidlambda-0-3-0.html
+ - feidlambda-0-3-1.html
+
---
-::: {.callout-important icon="false" .text-center}
-## Official GIST **feidlambda** (v0.3)
+::: {.callout-important icon="false" .text-center appearance="minimal"}
+## Official GIST **feidlambda** (v0.3.x)
+
+```default
+https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12
+```
-[Official GIST feidlambda (feid)](https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12)
:::
-Bagi yang sebelumnya menggunakan versi feidlambda v0.2 **wajib** untuk membaca [perubahan penting dan migrasi v0.2 ke v0.3](migration-v0-2-to-v0-3.qmd). Tapi, bagi yang baru menggunakan bisa [**langsung ke bagian fungsi feidlambda v0.3**](#sec-feid-v03).
+**Panduan instalasi feidlambda v0.3.x dapat dilihat di halaman [Penggunaan](/docs/install.qmd).**
+
+Bagi yang sebelumnya menggunakan versi feidlambda v0.2 **wajib** untuk membaca [perubahan penting dan migrasi v0.2 ke v0.3](/article/migration-v0-2-to-v0-3.qmd). Tapi, bagi yang baru menggunakan bisa [**langsung ke bagian fungsi feidlambda v0.3.x**](#sec-feid-v03).
::: {.column-screen-inset-shaded}
@@ -42,9 +52,31 @@ Bagi yang sebelumnya menggunakan versi feidlambda v0.2 **wajib** untuk membaca [
:::
-# Fungsi feidlambda v0.3 {#sec-feid-v03}
+# Update Log v0.3.x {#update-log}
+
+_Update Log_ merupakan catatan pembaruan feidlambda. Berikut catatan perubahan/pembaruan secara umum beserta penjelasan perubahan/pembaruan. Untuk perubahan berdasarkan fungsinya, bisa dilihat di bagian [_Changelog_](#changelog).
-Pada feidlambda v0.3, setiap fungsi dikategorikan sesuai kegunaannya. Berikut kategori yang tersedia di feidlambda v0.3:
+- **Update v0.3.1 (2022-01-13)**
+ - Pada fungsi `FILTER_MINMAX_ARRAY()` terdapat argumen opsional baru yaitu `take_first_only`. Jika `take_first_only = TRUE`, maka hasil filter minimum/maksimum hanya mengambil baris pertamanya saja (jika terdapat minimum/maksimum lebih dari satu baris).
+ - Pada fungsi `SWAP_*()`, nilai argumen `from_index` dan `to_index` menerima index negatif (indeks dari belakang). Bersamaan perubahan tersebut, nilai _default_ `to_index` menjadi `-1` yang artinya secara _default_ (tanpa argumen) fungsi `SWAP_*()` menukar posisi terdepan dengan terbelakang (baik berdasarkan baris ataupun kolom).
+ - Perubahan nama argumen pada beberapa fungsi seperti:
+ - `FILTER_MINMAX_COLUMN()`: `col -> column_index`, `with_lables -> with_label`.
+ - `GET_INDEX_2D()`: `return_order_only -> return_as_order`.
+ - `ROTATE_*()`: `n -> num_rotation`.
+ - `TEXT_SPLIT_VECTOR()`: `text_delimiter -> col_delimiter`.
+ - Fungsi `TEXT_SPLIT_VECTOR()` menggunakan metode _recursive_ dari fungsi `TEXTSPLIT()`.
+ - Pada fungsi `TEXT_SPLIT_VECTOR()` terdapat argumen opsional baru yaitu `replace_na`, yang berfungsi untuk mengubah nilai `#NA` dari hasil akhir.
+ - Tambahan informasi limitasi pada fungsi `TEXT_SPLIT_VECTOR()`.
+
+::: {.column-screen-inset-shaded}
+
+---
+
+:::
+
+# Fungsi feidlambda v0.3.x {#sec-feid-v03}
+
+Pada feidlambda v0.3.x, setiap fungsi dikategorikan sesuai kegunaannya. Berikut kategori yang tersedia di feidlambda v0.3.x:
- `FILTER_*`: Melakukan _filtering_ atau _subsetting_ (memilah) dari data.
- `GET_*`: Mengambil informasi dari data.
@@ -56,7 +88,11 @@ Pada feidlambda v0.3, setiap fungsi dikategorikan sesuai kegunaannya. Berikut ka
- `SWAP_*`: Menukar posisi data.
- `TEXT_*`: Fungsi tambahan yang berkaitan dengan teks.
-Download excel demonstrasi [RELEASE_feidlambda_v0_3.xlsx](https://github.com/fiakoenjiniring/feidlambda/releases/download/v0.3.0/RELEASE_feidlambda_v0_3.xlsx), untuk memudahkan mengeksplorasi fungsi baru di feidlambda v0.3.
+Download excel demonstrasi [RELEASE_feidlambda_v0_3_1.xlsx](https://github.com/fiakoenjiniring/feidlambda/releases/download/v0.3.1/RELEASE_feidlambda_v0_3_1.xlsx), untuk memudahkan mengeksplorasi fungsi baru di feidlambda v0.3.x.
+
+::: {.callout-note}
+Gambar yang ditampilkan pada halaman ini merupakan dari versi sebelumnya (feidlambda v0.3.0) dan tidak diperbarui untuk setiap _update_. Oleh karena itu, disarankan untuk mengeksplorasi langsung dari dokumen yang telah dilampirkan.
+:::
::: {.column-screen-inset-shaded}
@@ -66,7 +102,7 @@ Download excel demonstrasi [RELEASE_feidlambda_v0_3.xlsx](https://github.com/fia
# Kategori `FILTER_*` {#sec-filter}
-Kategori `FILTER_*` merupakan kumpulan fungsi yang melakukan _filtering_ atau _subsetting_ (memilah) dari data berupa vektor ataupun array. Hubungan antar fungsi di kategori ini bisa dilihat di @fig-dep-filter.
+Kategori `FILTER_*` merupakan kumpulan fungsi yang melakukan _filtering_ atau _subsetting_ (memilah) data berupa _vector_ ataupun _array_. Hubungan antar fungsi di kategori ini bisa dilihat di @fig-dep-filter.
```{mermaid}
%%| label: fig-dep-filter
@@ -152,14 +188,14 @@ _Output_
### `FILTER_MINMAX_ARRAY()` {#sec-filter-minmax-array}
-Fungsi `FILTER_MINMAX_ARRAY(array, [ignore_first_column], [with_labels], [label_vector])` digunakan untuk melakukan _filtering_ (memilah) data berdasarkan nilai minimum dan maksimum setiap kolomnya dan mengeluarkan hasil dalam berupa _dynamic array_.
+Fungsi `FILTER_MINMAX_ARRAY(array, [ignore_first_column], [with_label], [label_vector], [take_first_only])` digunakan untuk melakukan _filtering_ (memilah) data berdasarkan nilai minimum dan maksimum setiap kolomnya dan mengeluarkan hasil dalam berupa _dynamic array_.
::::: {.border .p-3 .my-3 .justify}
::: {.text-center .syntax}
_Syntax_
-: FILTER_MINMAX_ARRAY(array, [ignore_first_column], [with_labels], [label_vector])
+: FILTER_MINMAX_ARRAY(array, [ignore_first_column], [with_label], [label_vector], [take_first_only])
_Output_
: _array_
@@ -174,12 +210,15 @@ _Output_
`[ignore_first_column] := FALSE :: [TRUE | FALSE]`
: Nilai _default_ yaitu `FALSE`. Jika `TRUE`, maka kolom pertama dari `array` akan diabaikan dan tidak dilakukan _filtering_ nilai minimum/maksimum.
-`[with_labels] := FALSE :: [TRUE | FALSE]`
+`[with_label] := FALSE :: [TRUE | FALSE]`
: Nilai _default_ yaitu `FALSE`. Jika `TRUE`, maka kolom pertama dari _output_ adalah label informasi minimum dan maksimum seperti `1_min`, `1_max`, atau `no.column_min` dan `no.column_max`. Untuk menggunakan label sendiri, masukin _vector_ label di argumen `label_vector`.
`[label_vector] := NONE :: [vector]`
: Nilai _default_ yaitu `NONE`. Jika `NONE`, maka label setiap baris akan dinomori berdasarkan kolomnya (`1_min`, `1_max`). Jika ingin menggunakan label dari nama kolom, jumlah elemen _vector_ harus sama dengan jumlah kolom dari `array`. Untuk menggunakan label nilai `with_label` harus `TRUE`.
+`[take_first_only] := FALSE :: [TRUE | FALSE]`
+: **_(New in v0.3.1)_**. Nilai _default_ yaitu `FALSE`. Jika `TRUE`, maka hanya baris pertama yang diambil dari hasil pencarian nilai minimum/maksimum.
+
:::::
::: {#fig-filter-minmax-array .column-screen-inset layout="[[1,1]]" layout-valign="bottom"}
@@ -220,17 +259,17 @@ Dari @fig-dep-get, diketahui untuk versi v0.3 hanya tersedia fungsi `GET_INDEX_2
### `GET_INDEX_2D()`
-Fungsi `GET_INDEX_2D(lookup_value, array, [return_order_only])` dapat digunakan untuk mengambil informasi urutan nilai yang dicari ataupun posisi baris/kolom dari `array`.
+Fungsi `GET_INDEX_2D(lookup_value, array, [return_as_order])` dapat digunakan untuk mengambil informasi urutan nilai yang dicari ataupun posisi baris/kolom dari `array`.
::::: {.border .p-3 .my-3 .justify}
::: {.text-center .syntax}
_Syntax_
-: GET_INDEX_2D(lookup_value, array, [return_order_only])
+: GET_INDEX_2D(lookup_value, array, [return_as_order])
_Output_
-: _array_ ([_order_, _row index_, _column index_]) atau _number_ (_order_)
+: _array_ ([_order_, _row index_, _column index_]) atau _number vector_ (_order_)
:::
@@ -242,7 +281,7 @@ _Output_
`array := [array]`
: Data berupa _array_.
-`[return_order_only] := FALSE :: [TRUE | FALSE]`
+`[return_as_order] := FALSE :: [TRUE | FALSE]`
: Nilai _default_ yaitu `FALSE`. Jika `TRUE`, hasil fungsi memberikan urutan angka nilai yang dicari. Urutan dimulai dari horizontal kiri teratas sampai kanan terbawah. Jika `FALSE`, maka _output_ terdiri dari nomor urut, indeks kolom, dan indeks baris.
:::::
@@ -632,7 +671,7 @@ Fungsi utama yang tersedia saat ini hanya `RESHAPE_BY_COLUMNS()`.
### `RESHAPE_BY_COLUMNS()`
-Fungsi `RESHAPE_BY_COLUMNS(array, [num_split])` digunakan untuk mengubah dimensi (transformasi) `array` berdasarkan jumlah pembagi kolomnya.
+Fungsi `RESHAPE_BY_COLUMNS(array, [num_split])` digunakan untuk mengubah dimensi (transformasi) `array` berdasarkan jumlah pembagi kolomnya. Jika tidak jumlah kolom tidak habis dibagi oleh `num_split` akan mengeluarkan hasil `#N/A`.
::::: {.border .p-3 .my-3 .justify}
@@ -689,13 +728,13 @@ Seluruh fungsi yang tersedia di kategori ini akan dijelaskan.
### `ROTATE_VECTOR()`
-Fungsi `ROTATE_VECTOR(vector, n, [as_column_vector])` digunakan untuk menggeser/memutar elemen yang ada di _vector_ sebanyak `n`.
+Fungsi `ROTATE_VECTOR(vector, num_rotation, [as_column_vector])` digunakan untuk menggeser/memutar elemen yang ada di _vector_ sebanyak `num_rotation`.
::::: {.border .p-3 .my-3 .justify}
::: {.text-center .syntax}
_Syntax_
-: ROTATE_VECTOR(vector, n, [as_column_vector])
+: ROTATE_VECTOR(vector, num_rotation, [as_column_vector])
_Output_
: _vector_
@@ -706,7 +745,7 @@ _Output_
`vector := [vector]`
: Data berupa _vector_ (_column vector_ atau _row vector_).
-`n := [integer]`
+`num_rotation := [integer]`
: Jumlah berapa kali _vector_ diputar/digeser. Nilai negatif untuk digeser berlawanan arah.
`[as_column_vector] := TRUE :: [TRUE | FALSE]`
@@ -720,13 +759,13 @@ _Output_
### `ROTATE_ARRAY()`
-Fungsi `ROTATE_ARRAY(array, n, [rotate_columns])` digunakan untuk menggeser/memutar elemen yang ada di _array_ sebanyak `n` berdasarkan baris atau kolom.
+Fungsi `ROTATE_ARRAY(array, num_rotation, [rotate_columns])` digunakan untuk menggeser/memutar elemen yang ada di _array_ sebanyak `num_rotation` berdasarkan baris atau kolom.
::::: {.border .p-3 .my-3 .justify}
::: {.text-center .syntax}
_Syntax_
-: ROTATE_ARRAY(array, n, [rotate_columns])
+: ROTATE_ARRAY(array, num_rotation, [rotate_columns])
_Output_
: _array_
@@ -737,7 +776,7 @@ _Output_
`array := [array]`
: Data berupa _array_.
-`n := [scalar | vector]`
+`num_rotation := [scalar | vector]`
: Jumlah berapa kali _vector_ diputar/digeser. Nilai negatif untuk digeser berlawanan arah.
`[rotate_columns] := TRUE :: [TRUE | FALSE]`
@@ -798,10 +837,10 @@ _Output_
: Data dapat berupa _array_ atau _row vector_.
`[from_index] := 1 :: [integer]`
-: Nilai _default_ yaitu 1. Posisi _index_ kolom yang ingin dipindahkan.
+: **_(Change in v0.3.1)_**. Nilai _default_ yaitu `1`. Posisi _index_ kolom yang ingin dipindahkan. Jika menggunakan indeks negatif, maka posisi diambil dari belakang.
-`[to_index] := 2 :: [integer]`
-: Nilai _default_ yaitu 2. Posisi _index_ tujuan kolom.
+`[to_index] := -1 :: [integer]`
+: **_(Change in v0.3.1)_**. Nilai _default_ yaitu `-1`. Posisi _index_ tujuan kolom. Jika menggunakan indeks negatif, maka posisi diambil dari belakang.
:::::
@@ -825,10 +864,10 @@ _Output_
: Data dapat berupa _array_ atau _column vector_.
`[from_index] := 1 :: [integer]`
-: Nilai _default_ yaitu 1. Posisi _index_ baris yang ingin dipindahkan.
+: **_(Change in v0.3.1)_**. Nilai _default_ yaitu `1`. Posisi _index_ baris yang ingin dipindahkan. Jika menggunakan indeks negatif, maka posisi diambil dari belakang.
-`[to_index] := 2 :: [integer]`
-: Nilai _default_ yaitu 2. Posisi _index_ tujuan baris.
+`[to_index] := -1 :: [integer]`
+: **_(Change in v0.3.1)_**. Nilai _default_ yaitu `-1`. Posisi _index_ tujuan baris. Jika menggunakan indeks negatif, maka posisi diambil dari belakang.
:::::
@@ -853,7 +892,8 @@ Kategori `TEXT_*` merupakan kumpulan fungsi yang digunakan untuk memproses data
%%{ init: { 'theme': 'forest' } }%%
flowchart LR
- NONE --> TEXT_SPLIT_VECTOR
+ _RECURSIVE_TEXT_SPLIT --> _RECURSIVE_TEXT_SPLIT
+ _RECURSIVE_TEXT_SPLIT --> TEXT_SPLIT_VECTOR
```
Seluruh fungsi yang tersedia di kategori ini akan dijelaskan.
@@ -866,13 +906,13 @@ Seluruh fungsi yang tersedia di kategori ini akan dijelaskan.
### `TEXT_SPLIT_VECTOR()`
-Fungsi `TEXT_SPLIT_VECTOR(text_vector, [text_delimiter], [row_delimiter], [ignore_empty], [match_mode], [pad_with])` merupakan fungsi pengembangan lanjutan dari `TEXTSPLIT()` yang mampu menerima _input_ data berupa _vector_ dan menghasilkan dalam bentuk _dynamic array_.
+Fungsi `TEXT_SPLIT_VECTOR(text_vector, [col_delimiter], [row_delimiter], [ignore_empty], [match_mode], [pad_with], [replace_na])` merupakan fungsi pengembangan lanjutan dari `TEXTSPLIT()` yang mampu menerima _input_ data berupa _vector_ dan menghasilkan dalam bentuk _dynamic array_.
::::: {.border .p-3 .my-3 .justify}
::: {.text-center .syntax}
_Syntax_
-: TEXT_SPLIT_VECTOR(text_vector, [text_delimiter], [row_delimiter], [ignore_empty], [match_mode], [pad_with])
+: TEXT_SPLIT_VECTOR(text_vector, [col_delimiter], [row_delimiter], [ignore_empty], [match_mode], [pad_with], [replace_na])
_Output_
: _array_
@@ -883,11 +923,11 @@ _Output_
`text_vector := [text vector]`
: Data harus berupa _text column vector_.
-`[text_delimiter] := " " :: [text]`
+`[col_delimiter] := " " :: [text]`
: Nilai _default_ yaitu `" "` (spasi). Teks pemisah untuk setiap kolomnya.
-`[row_delimiter] := "|<#>|" :: [text]`
-: Nilai _default_ yaitu `"|<#>|"` (spasi). Teks pemisah untuk setiap barisnya. Fungsi `TEXT_SPLIT_VECTOR()` akan membuat `text_vector` menjadi tipe teks _scalar_ sebelum diubah menjadi _dynamic array_. Sehingga, opsi ini sebaiknya disesuaikan dengan teks yang ada di `text_vector`.
+`[row_delimiter] := "" :: [text]`
+: **_(Change in v0.3.1)_**. Nilai _default_ yaitu `""` (tidak ada). Teks pemisah untuk setiap barisnya.
`[ignore_empty] := FALSE :: [TRUE | FALSE]`
: Tentukan `TRUE` untuk mengabaikan pemisah berurutan. Default ke `FALSE`, yang membuat sel kosong. Opsional.
@@ -896,14 +936,23 @@ _Output_
: Tentukan `1` untuk melakukan kecocokan yang tidak peka huruf besar kecil. Default ke `0`, yang melakukan kecocokan peka huruf besar kecil. Opsional.
`[pad_with] := #N/A :: [text | number]`
-: Nilai untuk mengalihkan hasil. Defaultnya adalah #N/A.
+: Nilai untuk mengalihkan hasil. Defaultnya adalah `#N/A`.
+
+`[replace_na] := #N/A :: [text | number]`
+: **_(New in v0.3.1)_**. Nilai untuk menggantikan nilai `#N/A` dari hasil akhir. Defaultnya adalah `#N/A`. Nilai `#N/A` yang ada dikarenakan proses `VSTACK()` yang memiliki dimensi hasil `TEXTSPLIT()` yang berbeda-beda.
:::::
Deskripsi `ignore_empty`, `match_mode`, dan `pad_with` diambil dari halaman [Fungsi TEXTSPLIT](https://support.microsoft.com/id-id/office/fungsi-textsplit-b1ca414e-4c21-4ca0-b1b7-bdecace8a6e7).
+#### Limitasi `TEXT_SPLIT_VECTOR()`
+
+- Hindari menggunakan `TEXT_SPLIT_VECTOR()` dengan jumlah baris yang banyak ataupun dimensi _output_ yang besar. Pastikan hasil _output_ fungsi memiliki dimensi yang kecil seperti jumlah kolom $\le 10$ dan jumlah baris $\le 1,000$.
+- Ukuran `text_vector` masih bisa lebih besar dari batasan diatas, akan tetapi disarankan untuk penggunaan `TEXT_SPLIT_VECTOR()` selalu bertahap, yaitu dari jumlah baris yang sedikit sampai jumlah baris optimal yang tidak menampilkan _error_ atau _crash_.
+- Jika melebihi kemampuan, akan menghasilkan nilai _error_ berupa `#NUM` / `#CALC`.
+
::: {.column-page}
-{#fig-text-split-vector}
+{#fig-text-split-vector}
:::
::: {.column-screen-inset-shaded}
@@ -920,4 +969,44 @@ Jika ada ide untuk pengembangan feidlambda atau fungsi baru bisa langsung membua
---
-:::
\ No newline at end of file
+:::
+
+# Changelog
+
+- **2022-01-13 (v0.3.1)**
+ - Perubahan fungsi utama:
+ - Perubahan `FILTER_MINMAX_ARRAY()`:
+ - Menambah _optional_ argumen `take_first_only`.
+ - Mengganti nama argumen: `with_labels -> with_label`.
+ - Penyesuaian `_RECURSIVE_FILTER_MINMAX()` dengan posisi dan opsi argumen terbaru.
+ - Perubahan `GET_INDEX_2D()`:
+ - Mengubah nama argumen: `return_order_only -> return_as_order`.
+ - Perubahan `RESHAPE_BY_COLUMNS()`:
+ - Mengubah hasil _error_ menjadi `NA()`.
+ - Perubahan `ROTATE_VECTOR()` dan `ROTATE_ARRAY()`:
+ - Mengubah nama argumen: `n -> num_rotation`.
+ - Perubahan `SWAP_COLUMNS()` dan `SWAP_ROWS()`:
+ - Argumen `from_index` dan `to_index` dapat menggunakan indeks negatif.
+ - Nilai _default_ `to_index` menjadi `-1`.
+ - Perubahan `TEXT_SPLIT_VECTOR()`:
+ - Mengubah metode menjadi _recursive_.
+ - Mengubah nama argumen: `text_delimiter -> col_delimiter`.
+ - Menambah _optional_ argumen `replace_na`.
+ - Perubahan fungsi pendukung:
+ - Perubahan `FILTER_FUNC_COLUMN()`:
+ - Mengganti nama argumen: `col -> column_index`.
+ - Menukar posisi argumen `label_col` dan `with_label`.
+ - Menambah optional argumen `take_first_only`.
+ - Perubahan `FILTER_MINMAX_COLUMN()`:
+ - Mengganti nama argumen: `col -> column_index`.
+ - Menukar posisi argumen `label_col` dan `with_label`.
+ - Menambah _optional_ argumen `take_first_only`.
+ - Penyesuaian `FILTER_FUNC_COLUMN()` dengan posisi dan opsi argumen terbaru.
+ - Perubahan `_RECURSIVE_FILTER_MINMAX()`:
+ - Mengubah posisi argumen `label_col` dan `with_label`.
+ - Penyesuaian `FILTER_MINMAX_COLUMN()` dengan posisi dan opsi argumen terbaru.
+ - Fungsi baru `_RECURSIVE_TEXT_SPLIT()`:
+ - Fungsi pendukung `TEXT_SPLIT_VECTOR()`.
+- **2022-01-06 (v0.3.0)**
+ - Rilis feidlambda v0.3
+
diff --git a/release/feidlambda.qmd b/release/feidlambda.qmd
deleted file mode 100644
index fa8d1e8..0000000
--- a/release/feidlambda.qmd
+++ /dev/null
@@ -1,33 +0,0 @@
----
-title: |
- _Source Code_ feidlambda
-subtitle: |
- _Source Code_ feidlambda v0.3
-author: fiakodev
-date: 2022-09-28
-date-modified: 2023-01-06
-toc: false
-link-external-newwindow: true
-layout: article
-license: MIT LICENSE
-lang: id
-date-format: full
-
-code-copy: true
-code-line-numbers: true
-code-link: true
-code-block-border-left: "#34a3f7"
-code-overflow: scroll
-
-filters:
- - "../include-code-files.lua"
-
----
-
-::: {.callout-note icon="false" .text-center}
-## Official GIST **feidlambda** (v0.3)
-[Official GIST feidlambda v0.3](https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12)
-:::
-
-```{.scala include="../_feidlambda/feid"}
-```
\ No newline at end of file
diff --git a/release/source-code.qmd b/release/source-code.qmd
new file mode 100644
index 0000000..ed8bc76
--- /dev/null
+++ b/release/source-code.qmd
@@ -0,0 +1,24 @@
+---
+title: |
+ _Source Code_
+subtitle: |
+ _Source Code_ feidlambda v0.3
+# author: fiakodev
+toc: false
+link-external-newwindow: true
+layout: article
+license: MIT LICENSE
+lang: id
+
+code-copy: true
+code-line-numbers: true
+# code-block-border-left: "#34a3f7"
+# code-overflow: scroll
+
+filters:
+ - "../include-code-files.lua"
+
+---
+
+```{.scala include="../_feidlambda/feid"}
+```
\ No newline at end of file