diff --git a/.gitignore b/.gitignore index 67f9f12..80bbfbe 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /.quarto/ -/_site/ \ No newline at end of file +/_site/ +/.luarc.json diff --git a/_feidlambda/feid b/_feidlambda/feid new file mode 100644 index 0000000..469710d --- /dev/null +++ b/_feidlambda/feid @@ -0,0 +1,412 @@ +/* +feidlambda v0.3.0 - LOGIC / UTILITIES FUNCTIONS BY FIAKO ENGINEERING +GIST feidlambda v0.3.0: https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12 +REPOSITORY: https://github.com/fiakoenjiniring/feidlambda +AUTHOR: @taruma +TESTED: Microsoft Excel v2211 (Build 16.0.15831.20098) +*/ + +/* +---- FILTER ---- +*/ + +// NONE --> FILTER_DROP_ROWS +FILTER_DROP_ROWS = LAMBDA(array, row_index, + LET( + row_index, TOCOL(row_index), + row_index_clean, FILTER(row_index, NOT(ISBLANK(row_index))), + nrows, ROWS(array), + row_sequence, SEQUENCE(nrows), + selected_row, BYROW(row_sequence, LAMBDA(each_row, OR(each_row = row_index_clean))), + FILTER(array, NOT(selected_row)) + ) +); + +// NONE --> FILTER_DROP_COLUMNS +FILTER_DROP_COLUMNS = LAMBDA(array, column_index, + LET( + column_index, TOROW(column_index), + column_index_clean, FILTER(column_index, NOT(ISBLANK(column_index))), + ncols, COLUMNS(array), + col_sequence, SEQUENCE(1, ncols), + selected_col, BYCOL(col_sequence, LAMBDA(each_col, OR(each_col = column_index_clean))), + FILTER(array, NOT(selected_col)) + ) +); + +// NONE --> FILTER_FUNC_COLUMN +FILTER_FUNC_COLUMN = LAMBDA(array, [col], [label_col], [with_label], [function], [label_function], + LET( + col, IF(ISOMITTED(col), 1, col), + label_col, IF(ISOMITTED(label_col), col, 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), + 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) + ) +); + +// FILTER_FUNC_COLUMN --> FILTER_MINMAX_COLUMN +FILTER_MINMAX_COLUMN = LAMBDA(array, [col], [label_col], [with_label], + 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), + 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], + LET( + ignore_first_column, IF(ISOMITTED(ignore_first_column), FALSE, ignore_first_column), + stop_col, IF(ignore_first_column, 2, 1), + label_vector, IF(ISOMITTED(label_vector), SEQUENCE(1, COLUMNS(array)), label_vector), + new_label, IF(stop_col = 2, HSTACK({" "}, label_vector), label_vector), + label_col, CHOOSECOLS(new_label, ntry), + IF( + ntry = stop_col, + FILTER_MINMAX_COLUMN(array, ntry, label_col, with_label), + LET( + results, FILTER_MINMAX_COLUMN(array, ntry, label_col, with_label), + next_try, ntry - 1, + VSTACK( + _RECURSIVE_FILTER_MINMAX( + array, + next_try, + ignore_first_column, + label_vector, + with_label + ), + results + ) + ) + ) + ) +); + +// _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) +); + +/* +---- GET ---- +*/ + +// NONE --> GET_INDEX_2D +GET_INDEX_2D = LAMBDA(lookup_value, array, [return_order_only], + LET( + return_order_only, IF(ISOMITTED(return_order_only), FALSE, return_order_only), + nrows, ROWS(array), + ncols, COLUMNS(array), + size, nrows * ncols, + array_flatten, TOCOL(array, , TRUE), + index_sequence, SEQUENCE(nrows, ncols, 1, 1), + rows_sequence, MAKEARRAY(nrows, ncols, LAMBDA(x, y, x)), + columns_sequence, MAKEARRAY(nrows, ncols, LAMBDA(x, y, y)), + rows_flatten, TOCOL(rows_sequence, , TRUE), + columns_flatten, TOCOL(columns_sequence, , TRUE), + 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) + ) +); + +/* +---- IS ---- +*/ + +// NONE --> IS_ALL_IN_LOOKUP_VECTOR +IS_ALL_IN_VECTOR = LAMBDA(lookup_vector, array, + LET( + lookup_vector, TOCOL(lookup_vector), + MAP(array, LAMBDA(element, OR(BYROW(lookup_vector, LAMBDA(lookup, element = lookup))))) + ) +); + +// NONE --> IS_COLS_EQUAL_LOOKUP_VECTOR +IS_COLS_EQUAL_VECTOR = LAMBDA(lookup_vector, array, + LET( + lookup_vector, TOROW(lookup_vector), + ncols_vector, COLUMNS(lookup_vector), + ncols_array, COLUMNS(array), + nrows_array, ROWS(array), + IF( + ncols_array = ncols_vector, + LET( + repeat_array, CHOOSEROWS(lookup_vector, SEQUENCE(nrows_array, , 1, 0)), + MAP(array, repeat_array, LAMBDA(x, y, x = y)) + ), + "N/A" + ) + ) +); + +// IS_COLS_EQUAL_LOOKUP_VECTOR --> IS_ALL_COLS_EQUAL_LOOKUP_VECTOR +IS_ALL_COLS_EQUAL_VECTOR = LAMBDA(lookup_vector, array, [logical_function], + LET( + logical_function, IF(ISOMITTED(logical_function), LAMBDA(x, OR(x)), logical_function), + array_boolean, IS_COLS_EQUAL_VECTOR(lookup_vector, array), + BYROW(array_boolean, LAMBDA(each_row, logical_function(each_row))) + ) +); + +// NONE --> IS_ROWS_LOGICAL +IS_ROWS_LOGICAL = LAMBDA(logical_array, [logical_function], + LET( + logical_function, IF(ISOMITTED(logical_function), LAMBDA(x, OR(x)), logical_function), + BYROW(logical_array, LAMBDA(each_row, logical_function(each_row))) + ) +); + +// NONE --> IS_COLUMNS_LOGICAL +IS_COLUMNS_LOGICAL = LAMBDA(logical_array, [logical_function], + LET( + logical_function, IF(ISOMITTED(logical_function), LAMBDA(x, OR(x)), logical_function), + BYCOL(logical_array, LAMBDA(each_col, logical_function(each_col))) + ) +); + +/* +---- MAKE ---- +*/ + +// _RECURSIVE_MAKE_SEQUENCE --> _RECURSIVE_MAKE_SEQUENCE +_RECURSIVE_MAKE_SEQUENCE = LAMBDA(start_vector, end_vector, ntry, [stack_horizontally], + LET( + seq_start, INDEX(start_vector, ntry), + seq_end, INDEX(end_vector, ntry), + stack_horizontally, IF(ISOMITTED(stack_horizontally), FALSE, stack_horizontally), + IF( + ntry = 1, + SEQUENCE(seq_end - seq_start + 1, , seq_start), + LET( + next_try, ntry - 1, + results, SEQUENCE(seq_end - seq_start + 1, , seq_start), + IF( + stack_horizontally, + HSTACK( + _RECURSIVE_MAKE_SEQUENCE( + start_vector, + end_vector, + next_try, + stack_horizontally + ), + results + ), + VSTACK( + _RECURSIVE_MAKE_SEQUENCE( + start_vector, + end_vector, + next_try, + stack_horizontally + ), + results + ) + ) + ) + ) + ) +); + +// _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) +); + +/* +---- REPEAT ---- +*/ + +// REPEAT_ARRAY_BY_ROW & REPEAT_ARRAY_BY_COLUMN --> REPEAT_ARRAY +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) + ) + ) +); + +// REPEAT_ARRAY_BY_ROW --> REPEAT_ARRAY_BY_ROW +REPEAT_ARRAY_BY_ROW = LAMBDA(array, [num_repeat], + LET( + num_repeat, IF(ISOMITTED(num_repeat), 2, num_repeat), + IF( + num_repeat = 1, + array, + LET(next_repeat, num_repeat - 1, VSTACK(REPEAT_ARRAY_BY_ROW(array, next_repeat), array)) + ) + ) +); + +// REPEAT_ARRAY_BY_COLUMN --> REPEAT_ARRAY_BY_COLUMN +REPEAT_ARRAY_BY_COLUMN = LAMBDA(array, [num_repeat], + LET( + num_repeat, IF(ISOMITTED(num_repeat), 2, num_repeat), + IF( + num_repeat = 1, + array, + LET( + next_repeat, num_repeat - 1, + HSTACK(REPEAT_ARRAY_BY_COLUMN(array, next_repeat), array) + ) + ) + ) +); + +/* +---- RESHAPE ---- +*/ + +// NONE --> RESHAPE_BY_COLUMNS +RESHAPE_BY_COLUMNS = LAMBDA(array, [num_split], + LET( + num_split, IF(ISOMITTED(num_split), 2, num_split), + ncols, COLUMNS(array), + nrows, ROWS(array), + IF( + MOD(ncols, num_split) = 0, + LET( + divider, ncols / num_split, + divider_sequence, CHOOSEROWS(SEQUENCE(1, divider), SEQUENCE(num_split, , 1, 0)), + divider_flatten, TOCOL(divider_sequence, , TRUE), + divider_repeat, CHOOSEROWS(TOROW(divider_flatten), SEQUENCE(nrows, , 1, 0)), + divider_repeat_col, TOCOL(divider_repeat), + array_flatten, TOCOL(array), + array_sorted, SORTBY(array_flatten, divider_repeat_col), + WRAPROWS(array_sorted, num_split) + ), + "#INVALID_NUM_SPLIT" + ) + ) +); + +/* +---- ROTATE ---- +*/ + +// NONE --> ROTATE_VECTOR +ROTATE_VECTOR = LAMBDA(vector, n, [as_column_vector], + LET( + vector, TOCOL(vector), + rotated_array, IFS( + OR(n = 0, n >= ROWS(vector), n <= -ROWS(vector)), + vector, + n > 0, + VSTACK(DROP(vector, n), TAKE(vector, n)), + n < 0, + VSTACK(TAKE(vector, n), DROP(vector, n)) + ), + as_column_vector, IF(ISOMITTED(as_column_vector), FALSE, TRUE), + IF(as_column_vector, TOROW(rotated_array), TOCOL(rotated_array)) + ) +); + +// ROTATE_VECTOR --> ROTATE_ARRAY +ROTATE_ARRAY = LAMBDA(array, n, [rotate_columns], + LET( + rotate_columns, IF(ISOMITTED(rotate_columns), TRUE, FALSE), + nrows, ROWS(array), + ncols, COLUMNS(array), + seqrows, SEQUENCE(nrows), + seqcols, SEQUENCE(1, ncols), + results, IF( + rotate_columns, + CHOOSECOLS(array, ROTATE_VECTOR(seqcols, n, TRUE)), + CHOOSEROWS(array, ROTATE_VECTOR(seqrows, n, FALSE)) + ), + results + ) +); + +/* +---- SWAP ---- +*/ + +// NONE --> SWAP_COLUMNS +SWAP_COLUMNS = LAMBDA(array, [from_index], [to_index], + LET( + from_index, IF(ISOMITTED(from_index), 1, from_index), + to_index, IF(ISOMITTED(to_index), 2, 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), + CHOOSECOLS(array, replace_to) + ) +); + +// NONE --> SWAP_ROWS +SWAP_ROWS = LAMBDA(array, [from_index], [to_index], + LET( + from_index, IF(ISOMITTED(from_index), 1, from_index), + to_index, IF(ISOMITTED(to_index), 2, 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), + CHOOSEROWS(array, replace_to) + ) +); + +/* +---- TEXT ---- +*/ + +// NONE --> TEXT_SPLIT_VECTOR +TEXT_SPLIT_VECTOR = LAMBDA( + text_vector, + [text_delimiter], + [row_delimiter], + [ignore_empty], + [match_mode], + [pad_with], + LET( + text_delimiter, IF(ISOMITTED(text_delimiter), " ", text_delimiter), + row_delimiter, IF(ISOMITTED(row_delimiter), "|<#>|", row_delimiter), + 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) + ) +); + +/* +MIT License + +Copyright (c) 2022-2023 PT. FIAKO ENJINIRING INDONESIA + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ \ No newline at end of file diff --git a/_feidlambda/feid_FILTER b/_feidlambda/feid_FILTER new file mode 100644 index 0000000..d86bdff --- /dev/null +++ b/_feidlambda/feid_FILTER @@ -0,0 +1,88 @@ +// NONE --> FILTER_DROP_ROWS +FILTER_DROP_ROWS = LAMBDA(array, row_index, + LET( + row_index, TOCOL(row_index), + row_index_clean, FILTER(row_index, NOT(ISBLANK(row_index))), + nrows, ROWS(array), + row_sequence, SEQUENCE(nrows), + selected_row, BYROW(row_sequence, LAMBDA(each_row, OR(each_row = row_index_clean))), + FILTER(array, NOT(selected_row)) + ) +); + +// NONE --> FILTER_DROP_COLUMNS +FILTER_DROP_COLUMNS = LAMBDA(array, column_index, + LET( + column_index, TOROW(column_index), + column_index_clean, FILTER(column_index, NOT(ISBLANK(column_index))), + ncols, COLUMNS(array), + col_sequence, SEQUENCE(1, ncols), + selected_col, BYCOL(col_sequence, LAMBDA(each_col, OR(each_col = column_index_clean))), + FILTER(array, NOT(selected_col)) + ) +); + +// NONE --> FILTER_FUNC_COLUMN +FILTER_FUNC_COLUMN = LAMBDA(array, [col], [label_col], [with_label], [function], [label_function], + LET( + col, IF(ISOMITTED(col), 1, col), + label_col, IF(ISOMITTED(label_col), col, 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), + 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) + ) +); + +// FILTER_FUNC_COLUMN --> FILTER_MINMAX_COLUMN +FILTER_MINMAX_COLUMN = LAMBDA(array, [col], [label_col], [with_label], + 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), + 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], + LET( + ignore_first_column, IF(ISOMITTED(ignore_first_column), FALSE, ignore_first_column), + stop_col, IF(ignore_first_column, 2, 1), + label_vector, IF(ISOMITTED(label_vector), SEQUENCE(1, COLUMNS(array)), label_vector), + new_label, IF(stop_col = 2, HSTACK({" "}, label_vector), label_vector), + label_col, CHOOSECOLS(new_label, ntry), + IF( + ntry = stop_col, + FILTER_MINMAX_COLUMN(array, ntry, label_col, with_label), + LET( + results, FILTER_MINMAX_COLUMN(array, ntry, label_col, with_label), + next_try, ntry - 1, + VSTACK( + _RECURSIVE_FILTER_MINMAX( + array, + next_try, + ignore_first_column, + label_vector, + with_label + ), + results + ) + ) + ) + ) +); + +// _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 diff --git a/_feidlambda/feid_GET b/_feidlambda/feid_GET new file mode 100644 index 0000000..5c24d41 --- /dev/null +++ b/_feidlambda/feid_GET @@ -0,0 +1,19 @@ +// NONE --> GET_INDEX_2D +GET_INDEX_2D = LAMBDA(lookup_value, array, [return_order_only], + LET( + return_order_only, IF(ISOMITTED(return_order_only), FALSE, return_order_only), + nrows, ROWS(array), + ncols, COLUMNS(array), + size, nrows * ncols, + array_flatten, TOCOL(array, , TRUE), + index_sequence, SEQUENCE(nrows, ncols, 1, 1), + rows_sequence, MAKEARRAY(nrows, ncols, LAMBDA(x, y, x)), + columns_sequence, MAKEARRAY(nrows, ncols, LAMBDA(x, y, y)), + rows_flatten, TOCOL(rows_sequence, , TRUE), + columns_flatten, TOCOL(columns_sequence, , TRUE), + 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) + ) +); \ No newline at end of file diff --git a/_feidlambda/feid_IS b/_feidlambda/feid_IS new file mode 100644 index 0000000..2fa65a9 --- /dev/null +++ b/_feidlambda/feid_IS @@ -0,0 +1,50 @@ +// NONE --> IS_ALL_IN_LOOKUP_VECTOR +IS_ALL_IN_VECTOR = LAMBDA(lookup_vector, array, + LET( + lookup_vector, TOCOL(lookup_vector), + MAP(array, LAMBDA(element, OR(BYROW(lookup_vector, LAMBDA(lookup, element = lookup))))) + ) +); + +// NONE --> IS_COLS_EQUAL_LOOKUP_VECTOR +IS_COLS_EQUAL_VECTOR = LAMBDA(lookup_vector, array, + LET( + lookup_vector, TOROW(lookup_vector), + ncols_vector, COLUMNS(lookup_vector), + ncols_array, COLUMNS(array), + nrows_array, ROWS(array), + IF( + ncols_array = ncols_vector, + LET( + repeat_array, CHOOSEROWS(lookup_vector, SEQUENCE(nrows_array, , 1, 0)), + MAP(array, repeat_array, LAMBDA(x, y, x = y)) + ), + "N/A" + ) + ) +); + +// IS_COLS_EQUAL_LOOKUP_VECTOR --> IS_ALL_COLS_EQUAL_LOOKUP_VECTOR +IS_ALL_COLS_EQUAL_VECTOR = LAMBDA(lookup_vector, array, [logical_function], + LET( + logical_function, IF(ISOMITTED(logical_function), LAMBDA(x, OR(x)), logical_function), + array_boolean, IS_COLS_EQUAL_VECTOR(lookup_vector, array), + BYROW(array_boolean, LAMBDA(each_row, logical_function(each_row))) + ) +); + +// NONE --> IS_ROWS_LOGICAL +IS_ROWS_LOGICAL = LAMBDA(logical_array, [logical_function], + LET( + logical_function, IF(ISOMITTED(logical_function), LAMBDA(x, OR(x)), logical_function), + BYROW(logical_array, LAMBDA(each_row, logical_function(each_row))) + ) +); + +// NONE --> IS_COLUMNS_LOGICAL +IS_COLUMNS_LOGICAL = LAMBDA(logical_array, [logical_function], + LET( + 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 new file mode 100644 index 0000000..b1db5dc --- /dev/null +++ b/_feidlambda/feid_MAKE @@ -0,0 +1,42 @@ +// _RECURSIVE_MAKE_SEQUENCE --> _RECURSIVE_MAKE_SEQUENCE +_RECURSIVE_MAKE_SEQUENCE = LAMBDA(start_vector, end_vector, ntry, [stack_horizontally], + LET( + seq_start, INDEX(start_vector, ntry), + seq_end, INDEX(end_vector, ntry), + stack_horizontally, IF(ISOMITTED(stack_horizontally), FALSE, stack_horizontally), + IF( + ntry = 1, + SEQUENCE(seq_end - seq_start + 1, , seq_start), + LET( + next_try, ntry - 1, + results, SEQUENCE(seq_end - seq_start + 1, , seq_start), + IF( + stack_horizontally, + HSTACK( + _RECURSIVE_MAKE_SEQUENCE( + start_vector, + end_vector, + next_try, + stack_horizontally + ), + results + ), + VSTACK( + _RECURSIVE_MAKE_SEQUENCE( + start_vector, + end_vector, + next_try, + stack_horizontally + ), + results + ) + ) + ) + ) + ) +); + +// _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 new file mode 100644 index 0000000..2bc9541 --- /dev/null +++ b/_feidlambda/feid_REPEAT @@ -0,0 +1,39 @@ +// REPEAT_ARRAY_BY_ROW & REPEAT_ARRAY_BY_COLUMN --> REPEAT_ARRAY +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) + ) + ) +); + +// REPEAT_ARRAY_BY_ROW --> REPEAT_ARRAY_BY_ROW +REPEAT_ARRAY_BY_ROW = LAMBDA(array, [num_repeat], + LET( + num_repeat, IF(ISOMITTED(num_repeat), 2, num_repeat), + IF( + num_repeat = 1, + array, + LET(next_repeat, num_repeat - 1, VSTACK(REPEAT_ARRAY_BY_ROW(array, next_repeat), array)) + ) + ) +); + +// REPEAT_ARRAY_BY_COLUMN --> REPEAT_ARRAY_BY_COLUMN +REPEAT_ARRAY_BY_COLUMN = LAMBDA(array, [num_repeat], + LET( + num_repeat, IF(ISOMITTED(num_repeat), 2, num_repeat), + IF( + num_repeat = 1, + array, + LET( + next_repeat, num_repeat - 1, + HSTACK(REPEAT_ARRAY_BY_COLUMN(array, next_repeat), array) + ) + ) + ) +); diff --git a/_feidlambda/feid_RESHAPE b/_feidlambda/feid_RESHAPE new file mode 100644 index 0000000..8962928 --- /dev/null +++ b/_feidlambda/feid_RESHAPE @@ -0,0 +1,22 @@ +// NONE --> RESHAPE_BY_COLUMNS +RESHAPE_BY_COLUMNS = LAMBDA(array, [num_split], + LET( + num_split, IF(ISOMITTED(num_split), 2, num_split), + ncols, COLUMNS(array), + nrows, ROWS(array), + IF( + MOD(ncols, num_split) = 0, + LET( + divider, ncols / num_split, + divider_sequence, CHOOSEROWS(SEQUENCE(1, divider), SEQUENCE(num_split, , 1, 0)), + divider_flatten, TOCOL(divider_sequence, , TRUE), + divider_repeat, CHOOSEROWS(TOROW(divider_flatten), SEQUENCE(nrows, , 1, 0)), + divider_repeat_col, TOCOL(divider_repeat), + array_flatten, TOCOL(array), + array_sorted, SORTBY(array_flatten, divider_repeat_col), + WRAPROWS(array_sorted, num_split) + ), + "#INVALID_NUM_SPLIT" + ) + ) +); \ No newline at end of file diff --git a/_feidlambda/feid_ROTATE b/_feidlambda/feid_ROTATE new file mode 100644 index 0000000..52d219d --- /dev/null +++ b/_feidlambda/feid_ROTATE @@ -0,0 +1,33 @@ +// NONE --> ROTATE_VECTOR +ROTATE_VECTOR = LAMBDA(vector, n, [as_column_vector], + LET( + vector, TOCOL(vector), + rotated_array, IFS( + OR(n = 0, n >= ROWS(vector), n <= -ROWS(vector)), + vector, + n > 0, + VSTACK(DROP(vector, n), TAKE(vector, n)), + n < 0, + VSTACK(TAKE(vector, n), DROP(vector, n)) + ), + as_column_vector, IF(ISOMITTED(as_column_vector), FALSE, TRUE), + IF(as_column_vector, TOROW(rotated_array), TOCOL(rotated_array)) + ) +); + +// ROTATE_VECTOR --> ROTATE_ARRAY +ROTATE_ARRAY = LAMBDA(array, n, [rotate_columns], + LET( + rotate_columns, IF(ISOMITTED(rotate_columns), TRUE, FALSE), + nrows, ROWS(array), + ncols, COLUMNS(array), + seqrows, SEQUENCE(nrows), + seqcols, SEQUENCE(1, ncols), + results, IF( + rotate_columns, + CHOOSECOLS(array, ROTATE_VECTOR(seqcols, n, TRUE)), + CHOOSEROWS(array, ROTATE_VECTOR(seqrows, n, FALSE)) + ), + results + ) +); \ No newline at end of file diff --git a/_feidlambda/feid_SWAP b/_feidlambda/feid_SWAP new file mode 100644 index 0000000..5434d22 --- /dev/null +++ b/_feidlambda/feid_SWAP @@ -0,0 +1,27 @@ +// NONE --> SWAP_COLUMNS +SWAP_COLUMNS = LAMBDA(array, [from_index], [to_index], + LET( + from_index, IF(ISOMITTED(from_index), 1, from_index), + to_index, IF(ISOMITTED(to_index), 2, 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), + CHOOSECOLS(array, replace_to) + ) +); + +// NONE --> SWAP_ROWS +SWAP_ROWS = LAMBDA(array, [from_index], [to_index], + LET( + from_index, IF(ISOMITTED(from_index), 1, from_index), + to_index, IF(ISOMITTED(to_index), 2, 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), + CHOOSEROWS(array, replace_to) + ) +); \ No newline at end of file diff --git a/_feidlambda/feid_TEXT b/_feidlambda/feid_TEXT new file mode 100644 index 0000000..e907965 --- /dev/null +++ b/_feidlambda/feid_TEXT @@ -0,0 +1,16 @@ +// NONE --> TEXT_SPLIT_VECTOR +TEXT_SPLIT_VECTOR = LAMBDA( + text_vector, + [text_delimiter], + [row_delimiter], + [ignore_empty], + [match_mode], + [pad_with], + LET( + text_delimiter, IF(ISOMITTED(text_delimiter), " ", text_delimiter), + row_delimiter, IF(ISOMITTED(row_delimiter), "|<#>|", row_delimiter), + 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) + ) +); \ No newline at end of file diff --git a/_lambda/feid.lambda b/_lambda/feid.lambda deleted file mode 100644 index 83e55d4..0000000 --- a/_lambda/feid.lambda +++ /dev/null @@ -1 +0,0 @@ -// NARRATIVE FUNCTION diff --git a/_lambda/feid_utils.lambda b/_lambda/feid_utils.lambda deleted file mode 100644 index ec3242e..0000000 --- a/_lambda/feid_utils.lambda +++ /dev/null @@ -1,189 +0,0 @@ -/* -feid_utils v0.2.0 -LOGIC / UTILITIES FUNCTIONS BY FIAKO ENGINEERING -GIST LOGIC/UTILITIES (feid_utils): https://gist.github.com/taruma/60610672a9bd94724cba46f68b5614fa -REPOSITORY: https://github.com/fiakoenjiniring/feidlambda -AUTHOR: @taruma, LKO -TESTED: Microsoft 365 Business v2209 (Build 15629.20156) -*/ - -// INDEPENDENT FUNCTIONS - -// NEW IN v0.1 -REPEATCOLS = LAMBDA( - vector, - [num_repeat], - LET( - num_repeat, IF(ISOMITTED(num_repeat), 2, num_repeat), - colvector, TOCOL(vector), - repeatvector, CHOOSECOLS(colvector, SEQUENCE(num_repeat,,1,0)), - TOCOL(repeatvector,,TRUE) - ) -); - -SORTCOLS = LAMBDA( - table, - table_header, - LET( - header, table_header, - values, table, - ncols, COLUMNS(table), - headstack, VSTACK(header, SEQUENCE(1, ncols)), - headsorted, SORT(headstack, 1, 1, TRUE), - newindex, CHOOSEROWS(headsorted, 2), - sortedvalues, CHOOSECOLS(values, newindex), - sortedheader, CHOOSEROWS(headsorted, 1), - VSTACK(sortedheader, sortedvalues) - ) -); - -// NEW IN v0.2 -COMPAREVECTOR = LAMBDA( - left_vector, - right_vector, - LET( - left_vector, TOCOL(left_vector), - right_vector, TOCOL(right_vector), - BYROW( - left_vector, LAMBDA( - left, - OR(BYROW( - right_vector, LAMBDA( - right, - left=right - ) - )) - ) - ) - ) -); - -MULTICHECK = LAMBDA( - array, - search_vector, - [check_condition], - LET( - searchvector, TOROW(search_vector), - nrows, ROWS(array), - repeatarray, CHOOSEROWS(searchvector, SEQUENCE(nrows,,1,0)), - boolarray, MAP(array, repeatarray, LAMBDA(x, y, x=y)), - checkcondition, IF(ISOMITTED(check_condition), "AND", check_condition), - SWITCH(LOWER(checkcondition), - "and", BYROW(boolarray, LAMBDA(x, AND(x))), - "or", BYROW(boolarray, LAMBDA(x, OR(x))), - "INVALID CHECK CONDITION" - ) - ) -); - -// DEPENDENT FUNCTIONS (USING PREVIOUS FUNCTIONS) - -// NEW IN v0.1 -REPEATROWS = LAMBDA( - vector, - [num_repeat], - LET( - num_repeat, IF(ISOMITTED(num_repeat), 2, num_repeat), - repeatvector, REPEATCOLS(vector, num_repeat), - TOROW(repeatvector,,TRUE) - ) -); - -RESHAPECOLS = LAMBDA( - array, - [nsplit], - LET( - nsplit, IF(ISOMITTED(nsplit), 2, nsplit), - ncols, COLUMNS(array), - nrows, ROWS(array), - divider, CEILING.MATH(ncols/nsplit), - seqarray, CHOOSEROWS(SEQUENCE(1,divider), SEQUENCE(nsplit,,1,0)), - flatseq, TAKE(TOCOL(seqarray,,TRUE),ncols), - repseq, REPEATCOLS(flatseq, nrows), - flatarray, TOCOL(array), - sortedarray, SORTBY(flatarray,repseq), - IF( - MOD(ncols, nsplit)=0, - WRAPROWS(sortedarray, nsplit, ""), - CONCAT( - "Pick another nsplit. ", - "MOD(",ncols,",",nsplit,")", - " != 0." - ) - ) - ) -); - -FINDINDEX2D = LAMBDA( - lookup_value, - array, - LET( - nrows, ROWS(array), - ncols, COLUMNS(array), - size, nrows*ncols, - colarray, TOCOL(array), - seqrows, SORT(REPEATCOLS(SEQUENCE(nrows), ncols)), - seqcols, REPEATCOLS(SEQUENCE(ncols), nrows), - idnumber, SEQUENCE(size), - lookuptable, HSTACK(idnumber, seqrows, seqcols), - FILTER(lookuptable, colarray=lookup_value) - ) -); - -// NEW IN v0.2 -DROPROWS = LAMBDA( - array, - index_to_drop, - LET( - nrows, ROWS(array), - indexdrop, TOCOL(index_to_drop), - indexdropclean, FILTER(indexdrop, NOT(ISBLANK(indexdrop))), - seqvector, SEQUENCE(nrows), - boolvector, NOT(COMPAREVECTOR(seqvector, indexdropclean)), - FILTER(array, boolvector) - ) -); - -DROPCOLS = LAMBDA( - array, - index_to_drop, - LET( - transarray, TRANSPOSE(array), - droparray, DROPROWS(transarray, index_to_drop), - TRANSPOSE(droparray) - ) -); - -COUNTMULTICHECK = LAMBDA( - array, - search_vector, - [check_condition], - LET( - result, MULTICHECK(array, search_vector, check_condition), - SUM(INT(result)) - ) -); - -/* -MIT License - -Copyright (c) 2022 PT. FIAKO ENJINIRING INDONESIA - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ diff --git a/_language.yml b/_language.yml new file mode 100644 index 0000000..b0378c3 --- /dev/null +++ b/_language.yml @@ -0,0 +1,92 @@ +toc-title-document: "Daftar isi" +toc-title-website: "Pada halaman ini" + +section-title-abstract: "Abstrak" +section-title-appendices: "Lampiran" +section-title-footnotes: "Catatan Kaki" +section-title-references: "Referensi" +section-title-reuse: "Penggunaan Kembali" +section-title-citation: "Sitasi" + +appendix-attribution-cite-as: "Untuk atribusi, harap kutip karya ini sebagai:" +appendix-attribution-bibtex: "Sitasi BibTeX:" + +title-block-author-single: "Penulis" +title-block-author-plural: "Penulis" +title-block-affiliation-single: "Afiliasi" +title-block-affiliation-plural: "Afiliasi" +title-block-published: "Diterbitkan" +title-block-modified: "Diubah" + +callout-tip-caption: "Tip" +callout-note-caption: "Catatan" +callout-warning-caption: "Peringatan" +callout-important-caption: "Penting" +callout-caution-caption: "Bahaya" + +code-summary: "Kode" + +code-tools-menu-caption: "Kode" +code-tools-show-all-code: "Tampilkan Semua Kode" +code-tools-hide-all-code: "Sembunyikan Semua Kode" +code-tools-view-source: "View Source" +code-tools-source-code: "Source Code" + +copy-button-tooltip: "Copy to Clipboard" +copy-button-tooltip-success: "Copied!" + +repo-action-links-edit: "Ubah halaman ini" +repo-action-links-source: "Lihat sumber" +repo-action-links-issue: "Melaporkan isu" + +search-no-results-text: "No results" +search-matching-documents-text: "matching documents" +search-copy-link-title: "Copy link to search" +search-hide-matches-text: "Hide additional matches" +search-more-match-text: "more match in this document" +search-more-matches-text: "more matches in this document" +search-clear-button-title: "Clear" +search-detached-cancel-button-title: "Cancel" +search-submit-button-title: "Submit" + +crossref-fig-title: "Gambar" +crossref-tbl-title: "Tabel" +crossref-lst-title: "Listing" +crossref-thm-title: "Teorema" +crossref-lem-title: "Lemma" +crossref-cor-title: "Corollary" +crossref-prp-title: "Proposition" +crossref-cnj-title: "Conjecture" +crossref-def-title: "Definition" +crossref-exm-title: "Contoh" +crossref-exr-title: "Latihan" +crossref-ch-prefix: "Bab" +crossref-apx-prefix: "Lampiran" +crossref-sec-prefix: "Bab" +crossref-eq-prefix: "Persamaan" +crossref-lof-title: "Daftar Gambar" +crossref-lot-title: "Daftar Tabel" +crossref-lol-title: "List of Listings" + +environment-proof-title: "Proof" +environment-remark-title: "Remark" +environment-solution-title: "Solution" + +listing-page-order-by: "Order By" +listing-page-order-by-default: "Default" +listing-page-order-by-date-asc: "Oldest" +listing-page-order-by-date-desc: "Newest" +listing-page-order-by-number-desc: "High to Low" +listing-page-order-by-number-asc: "Low to High" +listing-page-field-date: "Date" +listing-page-field-title: "Title" +listing-page-field-description: "Description" +listing-page-field-author: "Author" +listing-page-field-filename: "File Name" +listing-page-field-filemodified: "Modified" +listing-page-field-subtitle: "Subtitle" +listing-page-field-readingtime: "Reading Time" +listing-page-field-categories: "Categories" +listing-page-minutes-compact: "{0} min" +listing-page-category-all: "All" +listing-page-no-matches: "No matching items" \ No newline at end of file diff --git a/_quarto.yml b/_quarto.yml index 4eece19..f213e96 100644 --- a/_quarto.yml +++ b/_quarto.yml @@ -46,6 +46,7 @@ website: - text: feidlambda 0.x menu: - href: release/feidlambda.qmd + - href: release/migration-v0-2-to-v0-3.qmd - href: release/feidlambda-0-3-0.qmd - href: release/feidlambda-0-2-0.qmd - href: release/feidlambda-0-1-0.qmd @@ -124,7 +125,7 @@ website: format: html: - theme: minty # lux, materia, minty, sandstone, spacelab, yeti, zephyr + theme: journal # lux, materia, minty, sandstone, spacelab, yeti, zephyr css: styles.css toc: true link-external-newwindow: true diff --git a/article_styles.css b/article_styles.css new file mode 100644 index 0000000..5a2d840 --- /dev/null +++ b/article_styles.css @@ -0,0 +1,5 @@ +/* css styles */ + +p { + text-align: justify; +} \ No newline at end of file diff --git a/copy_to_stagnatz.bat b/copy_to_stagnatz.bat new file mode 100644 index 0000000..52d12cb --- /dev/null +++ b/copy_to_stagnatz.bat @@ -0,0 +1 @@ +quarto render && xcopy _site\ "Z:\_INSITE\fiako-feidlambda\" /S /Y \ No newline at end of file diff --git a/docs/glossary.qmd b/docs/glossary.qmd index 3f8d7d4..b69f4c8 100644 --- a/docs/glossary.qmd +++ b/docs/glossary.qmd @@ -8,6 +8,9 @@ abstract: | Istilah ini digunakan untuk memudahkan penyampaian dan konsistensi dalam pengembangan `LAMBDA`. Istilah ini digunakan di FIAKO Engineering. abstract-title: Information date: 2022-10-21 +date-modified: 2023-01-06 +lang: id + toc: true toc-title: Daftar Istilah toc-depth: 5 @@ -115,6 +118,10 @@ _Vector_ atau _array_ yang berisikan nilai _numerik_. _Numeric Vector_ ::: +##### _TEXT VECTOR_ / _TEXT ARRAY_ + +_Vector_ atau _array_ yang berisikan nilai _text_ atau _string_. + ##### _ROW VECTOR_ _Vector_ yang melebar ke samping atau berupa baris. @@ -151,9 +158,9 @@ _Dynamic Array_ (_Vector_) _Dynamic Array_ (_Array_) ::: -##### _DYNAMIC ARRAY FORMULA_ +##### _DYNAMIC ARRAY FORMULA / FUNCTION_ -Formula yang mengeluarkan hasil lebih dari satu sel (_vector_ / _array_) dalam bentuk _dynamic array_. +Formula atau fungsi yang mengeluarkan hasil lebih dari satu sel (_vector_ / _array_) dalam bentuk _dynamic array_. Persamaan yang termasuk _dynamic array formula_ antara lain: `=POWER()`, `=ABS()`, `=ROUNDUP()`, dll. Yang perlu diingat bahwa formula _dynamic array_ mampu menghasilkan nilai dalam bentuk _vector_ atau _array_ sesuai jenis nilai yang dimasukkan. @@ -164,3 +171,7 @@ Persamaan yang termasuk _dynamic array formula_ antara lain: `=POWER()`, `=ABS() _Dynamic Array Formula_ ::: + +##### _SCALAR FORMULA / FUNCTION_ + +Formula atau fungsi yang mengluarkan hasil satu sel atau scalar (satu nilai). \ No newline at end of file diff --git a/docs/penggunaan-v1.qmd b/docs/penggunaan-v1.qmd new file mode 100644 index 0000000..d9616e0 --- /dev/null +++ b/docs/penggunaan-v1.qmd @@ -0,0 +1,70 @@ +--- +title: | + Instalasi feidlambda (outdated) +subtitle: | + Panduan pemasangan koleksi lambda `feidlambda` versi 0.x +author: Taruma Sakti Megariansyah +date: 2022-10-20 +toc: true +toc-location: right +number-sections: true +link-external-newwindow: true +layout: article +sidebar: side-docs +--- + +::: {.callout-important} +# AFE 1.1+ + +Dengan diperbaruinya versi AFE menjadi 1.1+, terdapat beberapa perubahan cara dalam melakukan import feidlambda. Perubahan berupa: + +- Harus dilakukan instalasi ulang untuk add-ins _Advanced Formula Environment_. +- Fitur terbaru AFE 1.1 bisa dilihat pada [README AFE](https://github.com/microsoft/advanced-formula-environment#readme). +- Saat import module melalui gist, _namespace_ modul tidak boleh memiliki karakter titik (`.`), sehingga yang sebelumnya `feid.utils` menjadi `feid_utils`. Perubahan ini akan dibarengi dengan pembaruan versi feidlambda 0.3.x. + +::: + +## **Advanced Formula Environment** + +_Install_ add-ins **Advanced Formula Environment** dari menu `Insert` > `Get Add-ins` > Cari **Advanced Formula Environment** (AFE). + +::: {.column-page} +![Menambahkan **Advanced Formula Environment** _Add-ins_](https://user-images.githubusercontent.com/1007910/192432581-0fd50e59-b0d0-4d9a-b802-81fda91060cb.png) +::: + +## _Import_ menggunakan AFE + +Setelah AFE terpasang di Microsoft Excel, lakukan _import_ dengan membuka AFE melalui `Home` > `Advanced Formula Environment` > `Import`. + +::: {.column-page} +![Melakukan _import_ di AFE](https://user-images.githubusercontent.com/1007910/192432838-0b21184d-f06b-4d03-b56b-97aad0cd392a.png) +::: + +## Salin _Github Gist URL_ + +Isi "Github Gist URL" dengan link koleksi lambda yang tersedia. _Checklist_ ✅ bagian "_Add formulas to new namespace_" dan isi _namespace_ dengan nama koleksi (contoh: `feid.utils`). + +::: {.callout-tip appearance="simple"} +Lakukan langkah _import_ (2-3) untuk setiap koleksi yang ingin ditambahkan. +::: + +![Isi _GitHub Gist URL_ dan _Namespace_](https://user-images.githubusercontent.com/1007910/192433790-edfb2237-dcc9-41e0-898e-36d8a58e3438.png) + +## _Sync_ formula + +Setelah _import_ seluruh koleksi yang digunakan, lakukan _synchronize_ yang bertujuan menyamakan nama pada _Formula/Excel Name Manager_. + +::: {.callout-caution appearance="simple"} +Jika muncul peringatan mengenai _hidden sheets_, pilih "Allow ...". +::: + +![_Synchronize_ AFE](https://user-images.githubusercontent.com/1007910/192444394-78f8a5d5-1015-45b7-91e9-57f77f86923f.png) + + +## Gunakan koleksi lambda + +Selesai _sync_, fungsi lambda bisa langsung digunakan. + +::: {.column-page} +![Gunakan koleksi lambda yang telah di-_import_](https://user-images.githubusercontent.com/1007910/192445916-242b2745-110b-44f7-9332-245b7fdaa695.png) +::: diff --git a/docs/penggunaan.qmd b/docs/penggunaan.qmd index d9616e0..0bfa268 100644 --- a/docs/penggunaan.qmd +++ b/docs/penggunaan.qmd @@ -1,10 +1,14 @@ --- title: | - Instalasi feidlambda (outdated) + Instalasi feidlambda subtitle: | - Panduan pemasangan koleksi lambda `feidlambda` versi 0.x + Panduan pemasangan `feidlambda` v0.3+ author: Taruma Sakti Megariansyah date: 2022-10-20 +date-modified: 2023-01-06 +date-format: full +lang: id + toc: true toc-location: right number-sections: true @@ -13,16 +17,7 @@ layout: article sidebar: side-docs --- -::: {.callout-important} -# AFE 1.1+ - -Dengan diperbaruinya versi AFE menjadi 1.1+, terdapat beberapa perubahan cara dalam melakukan import feidlambda. Perubahan berupa: - -- Harus dilakukan instalasi ulang untuk add-ins _Advanced Formula Environment_. -- Fitur terbaru AFE 1.1 bisa dilihat pada [README AFE](https://github.com/microsoft/advanced-formula-environment#readme). -- Saat import module melalui gist, _namespace_ modul tidak boleh memiliki karakter titik (`.`), sehingga yang sebelumnya `feid.utils` menjadi `feid_utils`. Perubahan ini akan dibarengi dengan pembaruan versi feidlambda 0.3.x. - -::: +Panduan ini untuk __Advanced Formula Environment__ v1.1. Panduan versi sebelumnya (v1.0) bisa dilihat [disini](penggunaan-v1.qmd). ## **Advanced Formula Environment** @@ -34,37 +29,35 @@ _Install_ add-ins **Advanced Formula Environment** dari menu `Insert` > `Get Add ## _Import_ menggunakan AFE -Setelah AFE terpasang di Microsoft Excel, lakukan _import_ dengan membuka AFE melalui `Home` > `Advanced Formula Environment` > `Import`. +Setelah AFE terpasang di Microsoft Excel, lakukan _import_ dengan membuka AFE melalui `Formula` > `Advanced Formula Environment` > `Import`. ::: {.column-page} -![Melakukan _import_ di AFE](https://user-images.githubusercontent.com/1007910/192432838-0b21184d-f06b-4d03-b56b-97aad0cd392a.png) -::: +![Melakukan _import_ di AFE](https://user-images.githubusercontent.com/1007910/210946239-4c14ea78-eb85-42b3-a2f6-976e3f6b2704.png) -## Salin _Github Gist URL_ - -Isi "Github Gist URL" dengan link koleksi lambda yang tersedia. _Checklist_ ✅ bagian "_Add formulas to new namespace_" dan isi _namespace_ dengan nama koleksi (contoh: `feid.utils`). - -::: {.callout-tip appearance="simple"} -Lakukan langkah _import_ (2-3) untuk setiap koleksi yang ingin ditambahkan. ::: -![Isi _GitHub Gist URL_ dan _Namespace_](https://user-images.githubusercontent.com/1007910/192433790-edfb2237-dcc9-41e0-898e-36d8a58e3438.png) +## Salin _Github Gist URL_ -## _Sync_ formula +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`). -Setelah _import_ seluruh koleksi yang digunakan, lakukan _synchronize_ yang bertujuan menyamakan nama pada _Formula/Excel Name Manager_. +![Isi _GitHub Gist URL_ dan nama _module_](https://user-images.githubusercontent.com/1007910/210946750-5b2563aa-3e23-4147-8771-d7ab7a40a5e4.png) -::: {.callout-caution appearance="simple"} -Jika muncul peringatan mengenai _hidden sheets_, pilih "Allow ...". -::: +## _Save_ / _Sync_ module -![_Synchronize_ AFE](https://user-images.githubusercontent.com/1007910/192444394-78f8a5d5-1015-45b7-91e9-57f77f86923f.png) +Setelah _import_ seluruh koleksi yang digunakan dan berhasil, lakukan _saving_ (_sync_) yang bertujuan untuk menerapkan module ke lembar kerja Excel. Shortcut untuk _save_ yaitu `Ctrl + S`. +![_Save_ / _Apply module_ ke lembar kerja](https://user-images.githubusercontent.com/1007910/210946979-d64c1d4a-b61b-4ab1-ab7b-b2d2c6ae4e1c.png) ## Gunakan koleksi lambda -Selesai _sync_, fungsi lambda bisa langsung digunakan. +Selesai _save_, fungsi **feidlambda** bisa langsung digunakan. ::: {.column-page} -![Gunakan koleksi lambda yang telah di-_import_](https://user-images.githubusercontent.com/1007910/192445916-242b2745-110b-44f7-9332-245b7fdaa695.png) +![Gunakan koleksi lambda yang telah di-_import_](https://user-images.githubusercontent.com/1007910/210947524-d4a8bce7-d33d-47b4-8a72-6cf5244c9651.png) ::: + +## 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). + +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/include-code-files.lua b/include-code-files.lua new file mode 100644 index 0000000..5a5269c --- /dev/null +++ b/include-code-files.lua @@ -0,0 +1,62 @@ +--- include-code-files.lua – filter to include code from source files +--- +--- Copyright: © 2020 Bruno BEAUFILS +--- License: MIT – see LICENSE file for details + +--- Dedent a line +local function dedent (line, n) + return line:sub(1,n):gsub(" ","") .. line:sub(n+1) +end + +--- Filter function for code blocks +local function transclude (cb) + if cb.attributes.include then + local content = "" + local fh = io.open(cb.attributes.include) + if not fh then + io.stderr:write("Cannot open file " .. cb.attributes.include .. " | Skipping includes\n") + else + local number = 1 + local start = 1 + + -- change hyphenated attributes to PascalCase + for i,pascal in pairs({"startLine", "endLine"}) + do + local hyphen = pascal:gsub("%u", "-%0"):lower() + if cb.attributes[hyphen] then + cb.attributes[pascal] = cb.attributes[hyphen] + cb.attributes[hyphen] = nil + end + end + + if cb.attributes.startLine then + cb.attributes.startFrom = cb.attributes.startLine + start = tonumber(cb.attributes.startLine) + end + for line in fh:lines ("L") + do + if cb.attributes.dedent then + line = dedent(line, cb.attributes.dedent) + end + if number >= start then + if not cb.attributes.endLine or number <= tonumber(cb.attributes.endLine) then + content = content .. line + end + end + number = number + 1 + end + fh:close() + end + -- remove key-value pair for used keys + cb.attributes.include = nil + cb.attributes.startLine = nil + cb.attributes.endLine = nil + cb.attributes.dedent = nil + -- return final code block + return pandoc.CodeBlock(content, cb.attr) + end +end + +return { + { CodeBlock = transclude } +} diff --git a/index.qmd b/index.qmd index b8f836a..4192143 100644 --- a/index.qmd +++ b/index.qmd @@ -16,19 +16,14 @@ sidebar: false ::: {.text-center .callout-important appearance="simple" icon="false"} ## Dalam Pengembangan -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). -::: - -::: {.text-center .callout-warning appearance="default"} -# Perubahan AFE 1.1+ dan feidlambda 0.3.x - -**Dengan diupdatenya AFE ke versi 1.1+, maka terdapat beberapa perubahan dalam pengembangan dan penggunaan feidlambda. Informasi perubahan ini akan diinformasikan secepatnya di bulan Januari 2023.** +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** -[GIST `feid_utils` v0.2.0](https://gist.github.com/taruma/60610672a9bd94724cba46f68b5614fa) +#### [GIST feidlambda v0.3](https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12) + --- -[v0.2.0](release/feidlambda-0-2-0.qmd) | [v0.1.0](release/feidlambda-0-1-0.qmd) | [panduan](docs/penggunaan.qmd) | [source code](release/feidlambda.qmd) +[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 diff --git a/release/excel/RELEASE_feidlambda_v0_3.xlsx b/release/excel/RELEASE_feidlambda_v0_3.xlsx new file mode 100644 index 0000000..f28ae39 Binary files /dev/null and b/release/excel/RELEASE_feidlambda_v0_3.xlsx differ diff --git a/release/feidlambda-0-3-0.qmd b/release/feidlambda-0-3-0.qmd index 9522b8f..f4f255a 100644 --- a/release/feidlambda-0-3-0.qmd +++ b/release/feidlambda-0-3-0.qmd @@ -1,41 +1,923 @@ --- title: | - feidlambda 0.3.0 (PREVIEW) + feidlambda v0.3 subtitle: | - Perubahan dan Fitur terbaru di `feidlambda v0.3.0` + Koleksi LAMBDA feidlambda v0.3 author: "Taruma Sakti Megariansyah" -abstract: | - (PREVIEW) Berikut perubahan yang akan dilakukan pada feidlambda v0.3.0 date: 2022-12-28 +date-modified: 2023-01-06 +date-format: full +lang: id toc: true toc-location: right -number-sections: true +number-sections: false number-offset: [0, 0] link-external-newwindow: true -layout: article + +fig-responsive: true + +filters: + - "../include-code-files.lua" + +format: + html: + mermaid-format: js + +crossref: + chapters: true --- ::: {.callout-important icon="false" .text-center} -## Official GIST **feid_utils** (v0.3.0) +## Official GIST **feidlambda** (v0.3) + +[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). + +::: {.column-screen-inset-shaded} + +--- + +::: + +# Fungsi feidlambda v0.3 {#sec-feid-v03} + +Pada feidlambda v0.3, setiap fungsi dikategorikan sesuai kegunaannya. Berikut kategori yang tersedia di feidlambda v0.3: + +- `FILTER_*`: Melakukan _filtering_ atau _subsetting_ (memilah) dari data. +- `GET_*`: Mengambil informasi dari data. +- `IS_*`: Fungsi _logical_ tambahan. +- `MAKE_*`: Membangkitkan data. +- `REPEAT_*`: Mengulangi/merepetisi data. +- `RESHAPE_*`: Mengubah dimensi data. +- `ROTATE_*`: Merubah posisi data dengan diputar. +- `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. + +::: {.column-screen-inset-shaded} + +--- + +::: + +# 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. + +```{mermaid} +%%| label: fig-dep-filter +%%| fig-cap: Grafik _dependencies_ kategori `FILTER_*` +%%| fig-height: 100% +%%{ init: { 'theme': 'forest' } }%% + +flowchart LR + NONE --> FILTER_DROP_ROWS + NONE --> FILTER_DROP_COLUMNS + NONE --> FILTER_FUNC_COLUMN + FILTER_FUNC_COLUMN --> FILTER_MINMAX_COLUMN + FILTER_MINMAX_COLUMN --> _RECURSIVE_FILTER_MINMAX + _RECURSIVE_FILTER_MINMAX --> _RECURSIVE_FILTER_MINMAX + _RECURSIVE_FILTER_MINMAX --> FILTER_MINMAX_ARRAY +``` + +Fungsi utama kategori `FILTER_*` yaitu `FILTER_DROP_ROWS()`, `FILTER_DROP_COLUMNS()`, dan `FILTER_MINMAX_ARRAY()`. + +
+_Source Code_ `FILTER_*` +```{.scala include="../_feidlambda/feid_FILTER" } +``` +
+ +### `FILTER_DROP_ROWS()` {#sec-filter-drop-rows} + +Fungsi `FILTER_DROP_ROWS(array, row_index)` digunakan untuk menghapus baris dari data. + +::::: {.border .p-3 .my-3 .justify} + +::: {.text-center .syntax} +_Syntax_ +: FILTER_DROP_ROWS(array, row_index) + +_Output_ +: _array_ +::: + +--- + +`array := [array | vector]` +: Data berupa _array_ atau _vector_ yang memiliki baris lebih dari satu. + +`row_index := [integer number | integer vector]` +: Indeks baris yang ingin dihapus. + +::::: + +::: {.column-page-left} +![Demonstrasi `FILTER_DROP_ROWS()`](img-0-3-0/feidlambda-v03-01-filter-1.gif){#fig-filter-drop-rows} +::: + +### `FILTER_DROP_COLUMNS()` {#sec-filter-drop-columns} + +Fungsi `FILTER_DROP_COLUMNS(array, column_index)` digunakan untuk menghapus kolom dari data. + +::::: {.border .p-3 .my-3 .justify} + +::: {.text-center .syntax} + +_Syntax_ +: FILTER_DROP_COLUMNS(array, column_index) + +_Output_ +: _array_ + +::: + +--- + +`array := [array | vector]` +: Data berupa _array_ atau _vector_ yang memiliki kolom lebih dari satu. + +`column_index := [integer number | integer vector]` +: Indeks kolom yang ingin dihapus. + +::::: + +::: {.column-page-left} +![Demonstrasi `FILTER_DROP_COLUMNS()`](img-0-3-0/feidlambda-v03-01-filter-2.gif){#fig-filter-drop-columns} +::: + +### `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_. + +::::: {.border .p-3 .my-3 .justify} + +::: {.text-center .syntax} + +_Syntax_ +: FILTER_MINMAX_ARRAY(array, [ignore_first_column], [with_labels], [label_vector]) + +_Output_ +: _array_ + +::: + +--- + +`array := [array | numeric array]` +: Data berupa _array_ dengan ketentuan `array` berisikan angka kecuali kolom pertama jika menggunakan opsi `ignore_first_column`. + +`[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]` +: 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`. + +::::: + +::: {#fig-filter-minmax-array .column-screen-inset layout="[[1,1]]" layout-valign="bottom"} +![](img-0-3-0/feidlambda-v03-01-filter-3.gif) + +![](img-0-3-0/feidlambda-v03-01-filter-4.gif) + +Demonstrasi `FILTER_MINMAX_ARRAY()` +::: + +::: {.column-screen-inset-shaded} + +--- + +::: + +# Kategori `GET_*` {#sec-get} + +Kategori `GET_*` merupakan kumpulan fungsi yang digunakan untuk mengambil informasi dari suatu data. Hubungan antar fungsi di kategori ini bisa dilihat di @fig-dep-get. + +```{mermaid} +%%| label: fig-dep-get +%%| fig-cap: Grafik _dependencies_ kategori `GET_*` +%%| fig-height: 100% +%%{ init: { 'theme': 'forest' } }%% + +flowchart LR + NONE --> GET_INDEX_2D +``` + +Dari @fig-dep-get, diketahui untuk versi v0.3 hanya tersedia fungsi `GET_INDEX_2D()`. + +
+_Source Code_ `GET_*` +```{.scala include="../_feidlambda/feid_GET" } +``` +
+ +### `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`. + +::::: {.border .p-3 .my-3 .justify} + +::: {.text-center .syntax} + +_Syntax_ +: GET_INDEX_2D(lookup_value, array, [return_order_only]) + +_Output_ +: _array_ ([_order_, _row index_, _column index_]) atau _number_ (_order_) + +::: + +--- + +`lookup_value := [scalar]` +: Nilai yang dicari dalam `array`. Nilai `lookup_value` adalah nilai tunggal berupa _scalar_. + +`array := [array]` +: Data berupa _array_. + +`[return_order_only] := 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. + +::::: + +::: {.column-page-left} +![Demonstrasi `GET_INDEX_2D()`](img-0-3-0/feidlambda-v03-02-get-1.gif){#fig-get-index-2d} +::: + +::: {.column-screen-inset-shaded} + +--- + +::: + +# Kategori `IS_*` {#sec-is} + +Kategori `IS_*` merupakan kumpulan fungsi yang dapat digunakan untuk melakukan fungsi logical di data. Hubungan antar fungsi di kategori ini bisa dilihat di @fig-dep-is. + +```{mermaid} +%%| label: fig-dep-is +%%| fig-cap: Grafik _dependencies_ kategori `IS_*` +%%| fig-height: 100% +%%{ init: { 'theme': 'forest' } }%% + +flowchart LR + NONE --> IS_ALL_IN_LOOKUP_VECTOR + NONE --> IS_COLS_EQUAL_LOOKUP_VECTOR + IS_COLS_EQUAL_LOOKUP_VECTOR --> IS_ALL_COLS_EQUAL_LOOKUP_VECTOR + NONE --> IS_ROWS_LOGICAL + NONE --> IS_COLUMNS_LOGICAL +``` + +Seluruh fungsi yang tersedia di kategori ini akan dijelaskan. + +
+_Source Code_ `IS_*` +```{.scala include="../_feidlambda/feid_IS" } +``` +
+ +### `IS_ALL_IN_VECTOR()` + +Fungsi `IS_ALL_IN_VECTOR(lookup_vector, array)` digunakan untuk memeriksa apakah setiap elemen di `array` termasuk dari `lookup_vector`. + +::::: {.border .p-3 .my-3 .justify} + +::: {.text-center .syntax} +_Syntax_ +: IS_ALL_IN_VECTOR(lookup_vector, array) + +_Output_ +: _logical array_ +::: + +--- + +`lookup_vector := [scalar | vector]` +: _Vector_ yang terdiri dari nilai yang ingin dicocokkan. + +`array := [array | vector]` +: Data berupa _array_ atau _vector_. + +::::: + +::: {.column-page-left} +![Demonstrasi `IS_ALL_IN_VECTOR()`](img-0-3-0/feidlambda-v03-03-is-1.gif){#fig-is-all-in-vector} +::: + +### `IS_COLS_EQUAL_VECTOR()` + +Fungsi `IS_COLS_EQUAL_VECTOR(lookup_vector, array)` digunakan untuk memeriksa apakah setiap kolom di `array` termasuk dari setiap elemen di `lookup_vector`. + +::::: {.border .p-3 .my-3 .justify} + +::: {.text-center .syntax} +_Syntax_ +: IS_COLS_EQUAL_VECTOR(lookup_vector, array) + +_Output_ +: _logical array_ +::: + +--- + +`lookup_vector := [vector]` +: _Vector_ yang terdiri dari nilai yang ingin dicocokkan. Jumlah elemen `lookup_vector` harus sama dengan jumlah kolom `array`. + +`array := [array | vector]` +: Data berupa _array_ . + +::::: + +::: {.column-page-left} +![Demonstrasi `IS_COLS_EQUAL_VECTOR()`](img-0-3-0/feidlambda-v03-03-is-2.gif){#fig-is-cols-equal-vector} +::: + + +### `IS_ALL_COLS_EQUAL_VECTOR()` + +Fungsi `IS_ALL_COLS_EQUAL_VECTOR(lookup_vector, array, [logical_function])` digunakan untuk memeriksa apakah setiap kolom di `array` termasuk dari setiap elemen di `lookup_vector`, dan diperiksa apakah setiap barisnya sesuai dengan `logical_function`. Fungsi ini menggunakan fungsi `IS_COLS_EQUAL_VECTOR()`. + +::::: {.border .p-3 .my-3 .justify} + +::: {.text-center .syntax} +_Syntax_ +: IS_ALL_COLS_EQUAL_VECTOR(lookup_vector, array, [logical_function]) + +_Output_ +: _column logical vector_ +::: + +--- + +`lookup_vector := [scalar | vector]` +: _Vector_ yang terdiri dari nilai yang ingin dicocokkan. Jumlah elemen `lookup_vector` harus sama dengan jumlah kolom `array`. + +`array := [array | vector]` +: Data berupa _array_ . + +`logical_function := OR() :: [LAMBDA scalar function]` +: Nilai _default_ adalah fungsi _lambda_ `OR()`. Fungsi _logical_ yang digunakan untuk mengaggregasi setiap barisnya. + +::::: + +::: {.column-page-left} +![Demonstrasi `IS_ALL_COLS_EQUAL_VECTOR()`](img-0-3-0/feidlambda-v03-03-is-3.gif){#fig-is-all-cols-equal-vector} +::: + + +### `IS_ROWS_LOGICAL()` + +Fungsi `IS_ROWS_LOGICAL(logical_array, [logical_function])` mengaggregasi setiap baris dari `logical_array` menggunakan fungsi `logical_function`. + +::::: {.border .p-3 .my-3 .justify} + +::: {.text-center .syntax} +_Syntax_ +: IS_ROWS_LOGICAL(logical_array, [logical_function]) + +_Output_ +: _column vector_ +::: + +--- + +`logical_array := [logical array]` +: Data berupa _logical array_ . + +`[logical_function] := OR() [LAMBDA scalar function]` +: Nilai _default_ adalah fungsi _lambda_ `OR()`. Fungsi _logical_ yang digunakan untuk mengaggregasi setiap barisnya. + +::::: + +### `IS_COLUMNS_LOGICAL()` + +Fungsi `IS_COLUMNS_LOGICAL(logical_array, [logical_function])` mengaggregasi setiap kolom dari `logical_array` menggunakan fungsi `logical_function`. + +::::: {.border .p-3 .my-3 .justify} + +::: {.text-center .syntax} +_Syntax_ +: IS_COLUMNS_LOGICAL(logical_array, [logical_function]) + +_Output_ +: _row vector_ +::: + +--- + +`logical_array := [logical array]` +: Data berupa _logical array_ . + +`[logical_function] := OR() [LAMBDA scalar function]` +: Nilai _default_ adalah fungsi _lambda_ `OR()`. Fungsi _logical_ yang digunakan untuk mengaggregasi setiap kolomnya. + +::::: + +::: {.column-page} +![Demonstrasi `IS_ROWS_LOGICAL()` dan `IS_COLUMNS_LOGICAL()`](img-0-3-0/feidlambda-v03-03-is-4.gif){#fig-is-rows-cols-logical} +::: + +::: {.column-screen-inset-shaded} + +--- + +::: + +# Kategori `MAKE_*` {#sec-make} + +Kategori `MAKE_*` merupakan kumpulan fungsi yang membangkitkan (_generate_) data. Hubungan antar fungsi di kategori ini bisa dilihat di @fig-dep-make. + +```{mermaid} +%%| label: fig-dep-make +%%| fig-cap: Grafik _dependencies_ kategori `MAKE_*` +%%| fig-height: 100% +%%{ init: { 'theme': 'forest' } }%% + +flowchart LR + _RECURSIVE_MAKE_SEQUENCE --> _RECURSIVE_MAKE_SEQUENCE + _RECURSIVE_MAKE_SEQUENCE --> MAKE_SEQUENCE_FROM_VECTOR +``` + +Fungsi utama pada kategori ini adalah `MAKE_SEQUENCE_FROM_VECTOR()`. + +
+_Source Code_ `MAKE_*` +```{.scala include="../_feidlambda/feid_MAKE" } +``` +
+ +### `MAKE_SEQUENCE_FROM_VECTOR()` + +Fungsi `MAKE_SEQUENCE_FROM_VECTOR(start_vector, end_vector, [stack_horizontally])` digunakan untuk mebangkitkan _sequence_ dari setiap baris/elemen di `start_vector` dan `end_vector`. + +::::: {.border .p-3 .my-3 .justify} + +::: {.text-center .syntax} +_Syntax_ +: MAKE_SEQUENCE_FROM_VECTOR(start_vector, end_vector, [stack_horizontally]) + +_Output_ +: _column vector_ atau _array_ +::: + +--- + +`start_vector := [integer vector]` +: _Vector_ yang terdiri dari bilangan bulat memulai _sequence_. + +`end_vector := [integer vector]` +: _Vector_ yang terdiri dari bilangan bulat akhir _sequence_. + +`[stack_horizontally] := FALSE :: [TRUE | FALSE]` +: Nilai _default_ yaitu FALSE. Jika `TRUE`, maka setiap _sequence_ yang dibangkitkan akan disusun horizontal. + +::::: + +::: {.column-page-left} +![Demonstrasi `MAKE_SEQUENCE_FROM_VECTOR()`](img-0-3-0/feidlambda-v03-04-make-1.gif){#fig-make-sequence-from-vector} +::: + +::: {.column-screen-inset-shaded} + +--- + +::: + +# Kategori `REPEAT_*` {#sec-repeat} + +Kategori `REPEAT_*` merupakan kumpulan fungsi yang digunakan untuk melakukan pengulangan _array_ ataupun _vector_ dan menghasilkannya dalam bentuk _dynamic array_. Hubungan antar fungsi di kategori ini bisa dilihat di @fig-dep-repeat. + +```{mermaid} +%%| label: fig-dep-repeat +%%| fig-cap: Grafik _dependencies_ kategori `REPEAT_*` +%%| fig-height: 100% +%%{ init: { 'theme': 'forest' } }%% + +flowchart LR + REPEAT_ARRAY_BY_ROW & REPEAT_ARRAY_BY_COLUMN --> REPEAT_ARRAY + REPEAT_ARRAY_BY_ROW --> REPEAT_ARRAY_BY_ROW + REPEAT_ARRAY_BY_COLUMN --> REPEAT_ARRAY_BY_COLUMN +``` + +Seluruh fungsi yang tersedia di kategori ini akan dijelaskan. + +
+_Source Code_ `REPEAT_*` +```{.scala include="../_feidlambda/feid_REPEAT" } +``` +
+ +### `REPEAT_ARRAY_BY_ROW()` + +Fungsi `REPEAT_ARRAY_BY_ROW(array, [num_repeat])` digunakan untuk mengulangi `array` sepanjang baris (ke bawah). + +::::: {.border .p-3 .my-3 .justify} + +::: {.text-center .syntax} +_Syntax_ +: REPEAT_ARRAY_BY_ROW(array, [num_repeat]) + +_Output_ +: _array_ +::: + +--- + +`array := [scalar | vector | array]` +: Data dapat berupa _scalar_, _vector_, ataupun _array_. + +`[num_repeat] := 2 :: [integer]` +: Nilai _default_ yaitu 2. Jumlah pengulangannya. + +::::: + +::: {.column-page-left} +![Demonstrasi `REPEAT_ARRAY_BY_ROW()`](img-0-3-0/feidlambda-v03-05-repeat-1.gif){#fig-repeat-array-by-row} +::: + +### `REPEAT_ARRAY_BY_COLUMN()` + +Fungsi `REPEAT_ARRAY_BY_COLUMN(array, [num_repeat])` digunakan untuk mengulangi `array` sepanjang kolom (ke kanan). + +::::: {.border .p-3 .my-3 .justify} + +::: {.text-center .syntax} +_Syntax_ +: REPEAT_ARRAY_BY_COLUMN(array, [num_repeat]) + +_Output_ +: _array_ +::: + +--- + +`array := [scalar | vector | array]` +: Data dapat berupa _scalar_, _vector_, ataupun _array_. + +`[num_repeat] := 2 :: [integer]` +: Nilai _default_ yaitu 2. Jumlah pengulangannya. + +::::: + +::: {.column-page-left} +![Demonstrasi `REPEAT_ARRAY_BY_COLUMN()`](img-0-3-0/feidlambda-v03-05-repeat-2.gif){#fig-repeat-array-by-column} +::: + + +### `REPEAT_ARRAY()` + +Fungsi `REPEAT_ARRAY(array, [num_repeat], [by_row])` digunakan untuk mengulangi `array` sepanjang baris/kolom (ke bawah/ke kanan). + +::::: {.border .p-3 .my-3 .justify} + +::: {.text-center .syntax} +_Syntax_ +: REPEAT_ARRAY(array, [num_repeat], [by_row]) + +_Output_ +: _array_ +::: + +--- + +`array := [scalar | vector | array]` +: Data dapat berupa _scalar_, _vector_, ataupun _array_. + +`[num_repeat] := 2 :: [integer]` +: Nilai _default_ yaitu 2. Jumlah pengulangannya. + +`[by_row] := TRUE :: [TRUE | FALSE]` +: Nilai _default_ yaitu `TRUE`. Jika `TRUE`, maka pengulangan akan sepanjang baris (ke bawah), dan berlaku sebaliknya juga. + +::::: + +::: {.column-page} +![Demonstrasi `REPEAT_ARRAY()`](img-0-3-0/feidlambda-v03-05-repeat-3.gif){#fig-repeat-array} +::: + +::: {.column-screen-inset-shaded} + +--- + +::: + +# Kategori `RESHAPE_*` {#sec-reshape} + +Kategori `RESHAPE_*` merupakan kumpulan fungsi yang dapat digunakan untuk melakukan fungsi logical di data. Hubungan antar fungsi di kategori ini bisa dilihat di @fig-dep-reshape. + +```{mermaid} +%%| label: fig-dep-reshape +%%| fig-cap: Grafik _dependencies_ kategori `RESHAPE_*` +%%| fig-height: 100% +%%{ init: { 'theme': 'forest' } }%% + +flowchart LR + NONE --> RESHAPE_BY_COLUMNS +``` + +Fungsi utama yang tersedia saat ini hanya `RESHAPE_BY_COLUMNS()`. + +
+_Source Code_ `RESHAPE_*` +```{.scala include="../_feidlambda/feid_RESHAPE" } +``` +
+ +### `RESHAPE_BY_COLUMNS()` + +Fungsi `RESHAPE_BY_COLUMNS(array, [num_split])` digunakan untuk mengubah dimensi (transformasi) `array` berdasarkan jumlah pembagi kolomnya. + +::::: {.border .p-3 .my-3 .justify} + +::: {.text-center .syntax} +_Syntax_ +: RESHAPE_BY_COLUMNS(array, [num_split]) + +_Output_ +: _array_ +::: + +--- + +`array := [array]` +: Data berupa _array_ atau _vector_. + +`[num_split] := 2 :: [integer]` +: Nilai _default_ yaitu 2. Jumlah pembagi kolom. Jumlah kolom `array` harus habis dibagi (`MOD()`) dengan `num_split`. + +::::: + +::: {.column-page} +![Demonstrasi `RESHAPE_BY_COLUMNS()`](img-0-3-0/feidlambda-v03-06-reshape-1.gif){#fig-reshape-by-columns} +::: + +::: {.column-screen-inset-shaded} + +--- + +::: + +# Kategori `ROTATE_*` {#sec-rotate} + +Kategori `ROTATE_*` merupakan kumpulan fungsi yang digunakan untuk menggeser atau memutar _array_ ataupun _vector_. Hubungan antar fungsi di kategori ini bisa dilihat di @fig-dep-rotate. + +```{mermaid} +%%| label: fig-dep-rotate +%%| fig-cap: Grafik _dependencies_ kategori `ROTATE_*` +%%| fig-height: 100% +%%{ init: { 'theme': 'forest' } }%% + +flowchart LR + NONE --> ROTATE_VECTOR + ROTATE_VECTOR --> ROTATE_ARRAY +``` + +Seluruh fungsi yang tersedia di kategori ini akan dijelaskan. + +
+_Source Code_ `ROTATE_*` +```{.scala include="../_feidlambda/feid_ROTATE" } +``` +
+ +### `ROTATE_VECTOR()` -COMING SOON +Fungsi `ROTATE_VECTOR(vector, n, [as_column_vector])` digunakan untuk menggeser/memutar elemen yang ada di _vector_ sebanyak `n`. + +::::: {.border .p-3 .my-3 .justify} + +::: {.text-center .syntax} +_Syntax_ +: ROTATE_VECTOR(vector, n, [as_column_vector]) + +_Output_ +: _vector_ +::: + +--- + +`vector := [vector]` +: Data berupa _vector_ (_column vector_ atau _row vector_). + +`n := [integer]` +: Jumlah berapa kali _vector_ diputar/digeser. Nilai negatif untuk digeser berlawanan arah. + +`[as_column_vector] := TRUE :: [TRUE | FALSE]` +: Nilai _default_ yaitu `TRUE`. Jika `TRUE`, maka _output_ berupa _column vector_. + +::::: + +::: {.column-page-left} +![Demonstrasi `ROTATE_VECTOR()`](img-0-3-0/feidlambda-v03-07-rotate-1.gif){#fig-rotate-vector} +::: + +### `ROTATE_ARRAY()` + +Fungsi `ROTATE_ARRAY(array, n, [rotate_columns])` digunakan untuk menggeser/memutar elemen yang ada di _array_ sebanyak `n` berdasarkan baris atau kolom. + +::::: {.border .p-3 .my-3 .justify} + +::: {.text-center .syntax} +_Syntax_ +: ROTATE_ARRAY(array, n, [rotate_columns]) + +_Output_ +: _array_ +::: + +--- + +`array := [array]` +: Data berupa _array_. + +`n := [scalar | vector]` +: Jumlah berapa kali _vector_ diputar/digeser. Nilai negatif untuk digeser berlawanan arah. + +`[rotate_columns] := TRUE :: [TRUE | FALSE]` +: Nilai _default_ yaitu `TRUE`. Jika `TRUE`, maka `array` diputar berdasarkan kolom. Jika `FALSE`, maka `array` diputar berdasarkan baris. + +::::: + +::: {.column-page-left} +![Demonstrasi `ROTATE_ARRAY()`](img-0-3-0/feidlambda-v03-07-rotate-2.gif){#fig-rotate-array} ::: -## Perubahan penting dari v0.2.0 ke v0.3.0 +::: {.column-screen-inset-shaded} + +--- + +::: + +# Kategori `SWAP_*` + +Kategori `SWAP_*` merupakan kumpulan fungsi yang digunakan untuk mengganti atau mengubah posisi elemen atau _vector_. Hubungan antar fungsi di kategori ini bisa dilihat di @fig-dep-swap. + +```{mermaid} +%%| label: fig-dep-swap +%%| fig-cap: Grafik _dependencies_ kategori `SWAP_*` +%%| fig-height: 100% +%%{ init: { 'theme': 'forest' } }%% + +flowchart LR + NONE --> SWAP_COLUMNS + NONE --> SWAP_ROWS +``` + +Seluruh fungsi yang tersedia di kategori ini akan dijelaskan. + +
+_Source Code_ `SWAP_*` +```{.scala include="../_feidlambda/feid_SWAP" } +``` +
+ +### `SWAP_COLUMNS()` + +Fungsi `SWAP_COLUMNS(array, [from_index], [to_index])` digunakan untuk menukar posisi kolom ke-`from_index` dengan kolom ke-`to_index`. + +::::: {.border .p-3 .my-3 .justify} + +::: {.text-center .syntax} +_Syntax_ +: SWAP_COLUMNS(array, [from_index], [to_index]) + +_Output_ +: _vector_ atau _array_ +::: + +--- + +`array := [row vector | array]` +: Data dapat berupa _array_ atau _row vector_. + +`[from_index] := 1 :: [integer]` +: Nilai _default_ yaitu 1. Posisi _index_ kolom yang ingin dipindahkan. + +`[to_index] := 2 :: [integer]` +: Nilai _default_ yaitu 2. Posisi _index_ tujuan kolom. + +::::: + +### `SWAP_ROWS()` + +Fungsi `SWAP_ROWS(array, [from_index], [to_index])` digunakan untuk menukar posisi baris ke-`from_index` dengan baris ke-`to_index`. -Terdapat penyesuaian nama fungsi-fungsi yang telah dikembangkan di feidlambda versi 0.2.0 dan sebelumnya. Berikut perubahan nama-nama fungsi yang mulai diterapkan pada feidlambda 0.3.0: +::::: {.border .p-3 .my-3 .justify} -1. `REPEATCOLS` menjadi `REPEAT_COLUMNS_VECTOR`. -2. `SORTCOLS` menjadi `ARRANGE_BY_ROW_VECTOR`. -3. `REPEATROWS` menjadi `REPEAT_ROWS_VECTOR`. -4. `RESHAPECOLS` menjadi `RESHAPE_TO_LONGER`. -5. `FINDINDEX2D` menjadi `GET_INDEX_FROM_ARRAY`. -6. `COMPAREVECTOR` menjadi `IS_IN_VECTOR`. -7. `MULTICHECK` menjadi `IS_EQUAL_VECTOR`. -8. `DROPROWS` menjadi `FILTER_DROP_ROWS`. -9. `DROPCOLS` menjadi `FILTER_DROP_COLUMNS`. -10. `COUNTMULTICHECK` menjadi `COUNT_IS_EQUAL_VECTOR`. +::: {.text-center .syntax} +_Syntax_ +: SWAP_COLUMNS(array, [from_index], [to_index]) -Bersamaan itu, akan terdapat perubahan penamaan argumen/parameter untuk setiap fungsinya. Perubahan ini disesuaikan untuk konsistensi dan kemudahan mendeskripsikan tugas setiap fungsinya. Versi v0.2.0 akan tetap tersedia tapi pengembangan lebih lanjut akan dialihkan ke versi v0.3+. +_Output_ +: _vector_ atau _array_ +::: + +--- + +`array := [column vector | array]` +: Data dapat berupa _array_ atau _column vector_. + +`[from_index] := 1 :: [integer]` +: Nilai _default_ yaitu 1. Posisi _index_ baris yang ingin dipindahkan. + +`[to_index] := 2 :: [integer]` +: Nilai _default_ yaitu 2. Posisi _index_ tujuan baris. + +::::: + +::: {.column-page} +![Demonstrasi `SWAP_COLUMNS()` dan `SWAP_ROWS()`](img-0-3-0/feidlambda-v03-08-swap-1.gif){#fig-swap-columns-rows} +::: + +::: {.column-screen-inset-shaded} + +--- + +::: + +# Kategori `TEXT_*` {#sec-text} + +Kategori `TEXT_*` merupakan kumpulan fungsi yang digunakan untuk memproses data teks. Hubungan antar fungsi di kategori ini bisa dilihat di @fig-dep-text. + +```{mermaid} +%%| label: fig-dep-text +%%| fig-cap: Grafik _dependencies_ kategori `TEXT_*` +%%| fig-height: 100% +%%{ init: { 'theme': 'forest' } }%% + +flowchart LR + NONE --> TEXT_SPLIT_VECTOR +``` + +Seluruh fungsi yang tersedia di kategori ini akan dijelaskan. + +
+_Source Code_ `TEXT_*` +```{.scala include="../_feidlambda/feid_TEXT" } +``` +
+ +### `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_. + +::::: {.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]) + +_Output_ +: _array_ +::: + +--- + +`text_vector := [text vector]` +: Data harus berupa _text column vector_. + +`[text_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`. + +`[ignore_empty] := FALSE :: [TRUE | FALSE]` +: Tentukan `TRUE` untuk mengabaikan pemisah berurutan. Default ke `FALSE`, yang membuat sel kosong. Opsional. + +`[match_mode] := 0 :: [0 | 1]` +: 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. + +::::: + +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). + +::: {.column-page} +![Demonstrasi `TEXT_SPLIT_VECTOR`](img-0-3-0/feidlambda-v03-09-text-1.gif){#fig-text-split-vector} +::: + +::: {.column-screen-inset-shaded} + +--- + +::: + +Fungsi feidlambda v0.3 memiliki $9$ kategori dengan total $23$ fungsi utama dan pendukung. Dengan perombakan struktur dan penamaan dari v0.2 ke v0.3, harapannya v0.3 sudah memiliki struktur dan penamaan yang konsisten sehingga untuk memproduksi fungsi ataupun fitur barunya lebih cepat di versi-versi berikutnya. + +Jika ada ide untuk pengembangan feidlambda atau fungsi baru bisa langsung membuat [isu di github](https://github.com/fiakoenjiniring/feidlambda/issues/new). Dan jika bertemu masalah saat penggunaan feidlambda v0.3, bisa juga membuat [isu di github](https://github.com/fiakoenjiniring/feidlambda/issues/new). + +::: {.column-screen-inset-shaded} + +--- +::: \ No newline at end of file diff --git a/release/feidlambda.qmd b/release/feidlambda.qmd index 0d3bfff..fa8d1e8 100644 --- a/release/feidlambda.qmd +++ b/release/feidlambda.qmd @@ -2,13 +2,16 @@ title: | _Source Code_ feidlambda subtitle: | - _Source Code_ Koleksi lambda versi 0.2.0 + _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 @@ -16,201 +19,15 @@ code-link: true code-block-border-left: "#34a3f7" code-overflow: scroll +filters: + - "../include-code-files.lua" + --- ::: {.callout-note icon="false" .text-center} -## Official GIST **feid_utils** (v0.2.0) - +## Official GIST **feidlambda** (v0.3) +[Official GIST feidlambda v0.3](https://gist.github.com/taruma/92bd33600a3d42dc9aead87558404a12) ::: -```default -/* -fiako.utils v0.2.0 -LOGIC / UTILITIES FUNCTIONS BY FIAKO ENGINEERING -GIST LOGIC/UTILITIES (feid_utils): https://gist.github.com/taruma/60610672a9bd94724cba46f68b5614fa -REPOSITORY: https://github.com/fiakoenjiniring/feidlambda -AUTHOR: @taruma, LKO -TESTED: Microsoft 365 Business v2209 (Build 15629.20156) -*/ - -// INDEPENDENT FUNCTIONS - -// NEW IN v0.1 -REPEATCOLS = LAMBDA( - vector, - [num_repeat], - LET( - num_repeat, IF(ISOMITTED(num_repeat), 2, num_repeat), - colvector, TOCOL(vector), - repeatvector, CHOOSECOLS(colvector, SEQUENCE(num_repeat,,1,0)), - TOCOL(repeatvector,,TRUE) - ) -); - -SORTCOLS = LAMBDA( - table, - table_header, - LET( - header, table_header, - values, table, - ncols, COLUMNS(table), - headstack, VSTACK(header, SEQUENCE(1, ncols)), - headsorted, SORT(headstack, 1, 1, TRUE), - newindex, CHOOSEROWS(headsorted, 2), - sortedvalues, CHOOSECOLS(values, newindex), - sortedheader, CHOOSEROWS(headsorted, 1), - VSTACK(sortedheader, sortedvalues) - ) -); - -// NEW IN v0.2 -COMPAREVECTOR = LAMBDA( - left_vector, - right_vector, - LET( - left_vector, TOCOL(left_vector), - right_vector, TOCOL(right_vector), - BYROW( - left_vector, LAMBDA( - left, - OR(BYROW( - right_vector, LAMBDA( - right, - left=right - ) - )) - ) - ) - ) -); - -MULTICHECK = LAMBDA( - array, - search_vector, - [check_condition], - LET( - searchvector, TOROW(search_vector), - nrows, ROWS(array), - repeatarray, CHOOSEROWS(searchvector, SEQUENCE(nrows,,1,0)), - boolarray, MAP(array, repeatarray, LAMBDA(x, y, x=y)), - checkcondition, IF(ISOMITTED(check_condition), "AND", check_condition), - SWITCH(LOWER(checkcondition), - "and", BYROW(boolarray, LAMBDA(x, AND(x))), - "or", BYROW(boolarray, LAMBDA(x, OR(x))), - "INVALID CHECK CONDITION" - ) - ) -); - -// DEPENDENT FUNCTIONS (USING PREVIOUS FUNCTIONS) - -// NEW IN v0.1 -REPEATROWS = LAMBDA( - vector, - [num_repeat], - LET( - num_repeat, IF(ISOMITTED(num_repeat), 2, num_repeat), - repeatvector, REPEATCOLS(vector, num_repeat), - TOROW(repeatvector,,TRUE) - ) -); - -RESHAPECOLS = LAMBDA( - array, - [nsplit], - LET( - nsplit, IF(ISOMITTED(nsplit), 2, nsplit), - ncols, COLUMNS(array), - nrows, ROWS(array), - divider, CEILING.MATH(ncols/nsplit), - seqarray, CHOOSEROWS(SEQUENCE(1,divider), SEQUENCE(nsplit,,1,0)), - flatseq, TAKE(TOCOL(seqarray,,TRUE),ncols), - repseq, REPEATCOLS(flatseq, nrows), - flatarray, TOCOL(array), - sortedarray, SORTBY(flatarray,repseq), - IF( - MOD(ncols, nsplit)=0, - WRAPROWS(sortedarray, nsplit, ""), - CONCAT( - "Pick another nsplit. ", - "MOD(",ncols,",",nsplit,")", - " != 0." - ) - ) - ) -); - -FINDINDEX2D = LAMBDA( - lookup_value, - array, - LET( - nrows, ROWS(array), - ncols, COLUMNS(array), - size, nrows*ncols, - colarray, TOCOL(array), - seqrows, SORT(REPEATCOLS(SEQUENCE(nrows), ncols)), - seqcols, REPEATCOLS(SEQUENCE(ncols), nrows), - idnumber, SEQUENCE(size), - lookuptable, HSTACK(idnumber, seqrows, seqcols), - FILTER(lookuptable, colarray=lookup_value) - ) -); - -// NEW IN v0.2 -DROPROWS = LAMBDA( - array, - index_to_drop, - LET( - nrows, ROWS(array), - indexdrop, TOCOL(index_to_drop), - indexdropclean, FILTER(indexdrop, NOT(ISBLANK(indexdrop))), - seqvector, SEQUENCE(nrows), - boolvector, NOT(COMPAREVECTOR(seqvector, indexdropclean)), - FILTER(array, boolvector) - ) -); - -DROPCOLS = LAMBDA( - array, - index_to_drop, - LET( - transarray, TRANSPOSE(array), - droparray, DROPROWS(transarray, index_to_drop), - TRANSPOSE(droparray) - ) -); - -COUNTMULTICHECK = LAMBDA( - array, - search_vector, - [check_condition], - LET( - result, MULTICHECK(array, search_vector, check_condition), - SUM(INT(result)) - ) -); - -/* -MIT License - -Copyright (c) 2022 PT. FIAKO ENJINIRING INDONESIA - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ +```{.scala include="../_feidlambda/feid"} ``` \ No newline at end of file diff --git a/release/img-0-3-0/feidlambda-v03-01-filter-1.gif b/release/img-0-3-0/feidlambda-v03-01-filter-1.gif new file mode 100644 index 0000000..193e81e Binary files /dev/null and b/release/img-0-3-0/feidlambda-v03-01-filter-1.gif differ diff --git a/release/img-0-3-0/feidlambda-v03-01-filter-2.gif b/release/img-0-3-0/feidlambda-v03-01-filter-2.gif new file mode 100644 index 0000000..4788863 Binary files /dev/null and b/release/img-0-3-0/feidlambda-v03-01-filter-2.gif differ diff --git a/release/img-0-3-0/feidlambda-v03-01-filter-3.gif b/release/img-0-3-0/feidlambda-v03-01-filter-3.gif new file mode 100644 index 0000000..19f8116 Binary files /dev/null and b/release/img-0-3-0/feidlambda-v03-01-filter-3.gif differ diff --git a/release/img-0-3-0/feidlambda-v03-01-filter-4.gif b/release/img-0-3-0/feidlambda-v03-01-filter-4.gif new file mode 100644 index 0000000..b00209e Binary files /dev/null and b/release/img-0-3-0/feidlambda-v03-01-filter-4.gif differ diff --git a/release/img-0-3-0/feidlambda-v03-02-get-1.gif b/release/img-0-3-0/feidlambda-v03-02-get-1.gif new file mode 100644 index 0000000..3000da2 Binary files /dev/null and b/release/img-0-3-0/feidlambda-v03-02-get-1.gif differ diff --git a/release/img-0-3-0/feidlambda-v03-03-is-1.gif b/release/img-0-3-0/feidlambda-v03-03-is-1.gif new file mode 100644 index 0000000..a065122 Binary files /dev/null and b/release/img-0-3-0/feidlambda-v03-03-is-1.gif differ diff --git a/release/img-0-3-0/feidlambda-v03-03-is-2.gif b/release/img-0-3-0/feidlambda-v03-03-is-2.gif new file mode 100644 index 0000000..7e82bc6 Binary files /dev/null and b/release/img-0-3-0/feidlambda-v03-03-is-2.gif differ diff --git a/release/img-0-3-0/feidlambda-v03-03-is-3.gif b/release/img-0-3-0/feidlambda-v03-03-is-3.gif new file mode 100644 index 0000000..b0bbec5 Binary files /dev/null and b/release/img-0-3-0/feidlambda-v03-03-is-3.gif differ diff --git a/release/img-0-3-0/feidlambda-v03-03-is-4.gif b/release/img-0-3-0/feidlambda-v03-03-is-4.gif new file mode 100644 index 0000000..71afb43 Binary files /dev/null and b/release/img-0-3-0/feidlambda-v03-03-is-4.gif differ diff --git a/release/img-0-3-0/feidlambda-v03-04-make-1.gif b/release/img-0-3-0/feidlambda-v03-04-make-1.gif new file mode 100644 index 0000000..5865108 Binary files /dev/null and b/release/img-0-3-0/feidlambda-v03-04-make-1.gif differ diff --git a/release/img-0-3-0/feidlambda-v03-05-repeat-1.gif b/release/img-0-3-0/feidlambda-v03-05-repeat-1.gif new file mode 100644 index 0000000..d2ae427 Binary files /dev/null and b/release/img-0-3-0/feidlambda-v03-05-repeat-1.gif differ diff --git a/release/img-0-3-0/feidlambda-v03-05-repeat-2.gif b/release/img-0-3-0/feidlambda-v03-05-repeat-2.gif new file mode 100644 index 0000000..78025b9 Binary files /dev/null and b/release/img-0-3-0/feidlambda-v03-05-repeat-2.gif differ diff --git a/release/img-0-3-0/feidlambda-v03-05-repeat-3.gif b/release/img-0-3-0/feidlambda-v03-05-repeat-3.gif new file mode 100644 index 0000000..a3eb867 Binary files /dev/null and b/release/img-0-3-0/feidlambda-v03-05-repeat-3.gif differ diff --git a/release/img-0-3-0/feidlambda-v03-06-reshape-1.gif b/release/img-0-3-0/feidlambda-v03-06-reshape-1.gif new file mode 100644 index 0000000..cfc6a95 Binary files /dev/null and b/release/img-0-3-0/feidlambda-v03-06-reshape-1.gif differ diff --git a/release/img-0-3-0/feidlambda-v03-07-rotate-1.gif b/release/img-0-3-0/feidlambda-v03-07-rotate-1.gif new file mode 100644 index 0000000..4e8841c Binary files /dev/null and b/release/img-0-3-0/feidlambda-v03-07-rotate-1.gif differ diff --git a/release/img-0-3-0/feidlambda-v03-07-rotate-2.gif b/release/img-0-3-0/feidlambda-v03-07-rotate-2.gif new file mode 100644 index 0000000..adfeb90 Binary files /dev/null and b/release/img-0-3-0/feidlambda-v03-07-rotate-2.gif differ diff --git a/release/img-0-3-0/feidlambda-v03-08-swap-1.gif b/release/img-0-3-0/feidlambda-v03-08-swap-1.gif new file mode 100644 index 0000000..7762aa9 Binary files /dev/null and b/release/img-0-3-0/feidlambda-v03-08-swap-1.gif differ diff --git a/release/img-0-3-0/feidlambda-v03-09-text-1.gif b/release/img-0-3-0/feidlambda-v03-09-text-1.gif new file mode 100644 index 0000000..4211e0a Binary files /dev/null and b/release/img-0-3-0/feidlambda-v03-09-text-1.gif differ diff --git a/release/migration-v0-2-to-v0-3.qmd b/release/migration-v0-2-to-v0-3.qmd new file mode 100644 index 0000000..8b74867 --- /dev/null +++ b/release/migration-v0-2-to-v0-3.qmd @@ -0,0 +1,124 @@ +--- +title: | + Migrasi feidlambda v0.2 ke v0.3 +subtitle: | + Panduan dan informasi migrasi feidlambda v0.2 ke v0.3 +author: "Taruma Sakti Megariansyah" +date: 2023-01-06 +date-format: full +lang: id + +toc: true +toc-location: right +number-sections: false +number-offset: [0, 0] +link-external-newwindow: true + +--- + +Halaman ini menjelaskan mengenai perubahan feidlambda v0.2 ke v0.3 dan panduan migrasinya. + + +# Migrasi v0.2 ke v0.3 {#sec-migration} + +Perubahan versi feidlambda v0.2 ke v0.3 bersifat **_breaking change_**, yang berarti penggunaan v0.2 tidak dapat digunakan lagi bersamaan dengan v0.3. Hal ini bisa terlihat dari nama fungsi maupun kodenya di v0.3. Perubahan ini diekspetasikan akan terjadi sepanjang pengembangan sampai versi v1.0, akan tetapi perubahan ini diusahakan seminimal mungkin. + +Penamaan juga yang sebelumnya menggunakan `feid.utils` menjadi `feid` saja atau bebas tergantung penamaan _module_-nya. + +Berikut nama-nama fungsi baru di feidlambda v0.3 yang menggantikan fungsi di versi sebelumnya (@tbl-feidlambda-v03-comparison). + +::: {.column-page} + +v0.2 | v0.3 +:- | :- +`REPEATCOLS(vector, [num_repeat])` | `REPEAT_ARRAY_BY_ROW(array, [num_repeat])` +`SORTCOLS(table, table_header)` | - +`REPEATROWS(vector, [num_repeat])` | `REPEAT_ARRAY_BY_COLUMN(array, [num_repeat])` +`RESHAPECOLS(array, [nsplit])` | `RESHAPE_BY_COLUMNS(array, [num_split])` +`FINDINDEX2D(lookup_value, array)` | `GET_INDEX_2D(lookup_value, array, [return_as_element])` +`COMPAREVECTOR(left_vector, right_vector)` | `IS_ALL_IN_VECTOR(array, lookup_vector)` +`MULTICHECK(array, search_vector, [check_condition])` | `IS_ALL_COLS_EQUAL_VECTOR(array, lookup_vector. [logical_function])` +`DROPROWS(array, index_to_drop)` | `FILTER_DROP_ROWS(array, row_index)` +`DROPCOLS(array, index_to_drop)` | `FILTER_DROP_COLUMNS(array, column_index)` +`COUNTMULTICHECK(array, search_vector, [check_condition])` | - + +: Fungsi pengganti di feidlambda v0.3 {#tbl-feidlambda-v03-comparison} + +::: + +Selain pengganti fungsi baru tersebut, mulai versi v0.3 akan dibuat kategori fungsi. Berikut kategori fungsi yang tersedia di versi v0.3 beserta deskripsinya: + +- `FILTER_*`: Melakukan _filtering_ atau _subsetting_ (memilah) dari data. +- `GET_*`: Mengambil informasi dari data. +- `IS_*`: Fungsi _logical_ tambahan. +- `MAKE_*`: Membangkitkan data. +- `REPEAT_*`: Mengulangi/mereptisi data. +- `RESHAPE_*`: Mengubah dimensi data. +- `ROTATE_*`: Merubah posisi data dengan diputar. +- `SWAP_*`: Mengganti posisi data. +- `TEXT_*`: Fungsi tambahan yang berkaitan dengan teks. + +## Mengulangi/merepetisi data + +Fungsi v0.2 +: `REPEATCOLS()` | `REPEATROWS()` + +Fungsi v0.3 +: `REPEAT_ARRAY_BY_COLUMN()` | `REPEAT_ARRAY_BY_ROW()` + +Di v0.2, fungsi untuk mengulangi data dapat menggunakan fungsi `REPEATCOLS()` atau `REPEATROWS()`. Akan tetapi, terdapat batasan terkait fungsi tersebut yaitu fungsi tersebut hanya menerima input berupa vector. Fungsi tersebut juga menggunakan fungsi `CHOOSE*()` sebagai fungsi utama dalam merepetisi datanya. Pada versi **v0.3**, fungsi tersebut digantikan oleh `REPEAT_ARRAY_BY_*()` atau `REPEAT_ARRAY()`. + +Sintaks yang awalnya `REPEAT*(vector, [num_repeat])` menjadi `REPEAT_ARRAY_BY_*(array, [num_repeat])`, jadi untuk fungsi ini **cukup mengganti nama fungsinya** saja. Perilakunya akan tetap sama dengan versi v0.2. Di versi v0.3, terdapat fungsi baru yaitu `REPEAT_ARRAY()` yang merupakan fungsi pembungkus untuk `REPEAT_ARRAY_BY_*()` dengan sintaks `REPEAT_ARRAY(array, [num_repeat], [by_row])`. Sehingga, bisa juga cukup mengganti fungsi versi sebelumnya dengan fungsi ini dengan tambahan opsional argumen `by_row`. + +## Mengurutkan data berdasarkan baris + +Fungsi v0.2 +: `SORTCOLS()` + +Fungsi v0.3 +: \- + +Untuk mengurutkan kolom berdasarkan baris tertentu bisa langsung menggunakan `SORT(array, [sort_index], [sort_order], [by_cols])` yang sudah disediakan di Microsoft Excel. Jadi untuk formula `SORTCOLS(table, table_header)` menjadi `SORT(array, [sort_index], [sort_order], [by_cols])` dengan catatan menggunakan argumen `by_cols <- TRUE`. + +## Mengubah dimensi data + +Fungsi v0.2 +: `RESHAPECOLS()` + +Fungsi v0.3 +: `RESHAPE_BY_COLUMNS()` + +Untuk fungsi `RESHAPECOLS(array, [nsplit])` dapat diganti menggunakan fungsi `RESHAPE_BY_COLUMNS(array, [num_split])`. Tidak ada perubahan dari posisi argumennya sehingga migrasinya berupa **cukup mengganti nama fungsinya**. + +## Mencari posisi nilai dari data + +Fungsi v0.2 +: `FINDINDEX2D()` + +Fungsi v0.3 +: `GET_INDEX_2D()` + +Untuk fungsi `FINDINDEX2D(lookup_value, array)` dapat digantikan menggunakan fungsi `GET_INDEX_2D(lookup_value, array, [return_number_only])`. Tidak ada perubahan dari posisi argumennya sehingga migrasinya berupa **cukup mengganti nama fungsinya**. Terdapat tambahan argumen `return_number_only` yang hasilnya hanya menyajikan urutan keberapa elemen yang ditemukannya. + +## Memeriksa hasil _logical_ + +Fungsi v0.2 +: `COMPAREVECTOR()` | `MULTICHECK()` + +Fungsi v0.3 +: `IS_ALL_IN_VECTOR()` | `IS_ALL_COLS_EQUAL_VECTOR()` + +Untuk fungsi `COMPAREVECTOR()` dan `MULTICHECK()` sebenarnya merupakan fungsi/formula yang digunakan untuk memeriksa suatu kondisi dari data. Oleh karena itu, penamaannya di v0.3 diganti menjadi `IS_*`. Hal tersebut menyamakan dengan fungsi `IS*` lainnya, yang bertujuan untuk memeriksa bahwa dataset ini memenuhi kondisi tertentu. `COMPAREVECTOR()` pada dasarnya adalah proses yang serupa dengan `%in%` di R, yang bertugas untuk memeriksa apakah setiap nilai elemen di suatu dataset termasuk dalam kumpulan nilai. Atau kata lainnya, memeriksa apakah elemen $X_i$ di $X$ ada di elemen $Y$. Sedangkan untuk `MULTICHECK()` memeriksa untuk _setiap kolom_ mengandung nilai yang sama dengan nilai yang dicari. + +Sintaks `COMPAREVECTOR(left_vector, right_vector)` menjadi `IS_ALL_IN_VECTOR(array, lookup_vector)`, yang bisa dibaca "Apakah (IS) semua elemen (ALL) termasuk (IN) di `lookup_vector` yang dicari (VECTOR)?". Sedangkan untuk `MULTICHECK(array, search_array, [check_condition])` menjadi `IS_ALL_COLS_EQUAL_VECTOR(array, lookup_vector, [logical_function])`, yang bisa dibaca "Apakah (IS) semua (ALL) setiap kolom (COLS) sama dengan (EQUAL) `lookup_vector`?". Jadi secara sekilas untuk migrasi **cukup mengganti nama fungsinya** dengan catatan `IS_ALL_COLS_EQUAL_VECTOR()` memiliki perubahan argumen opsional yang menjadi `logical_function` (berupa fungsi `LAMBDA()`). + +## Menghapus kolom atau baris dari data + +Fungsi v0.2 +: `DROPROWS()` | `DROPCOLS()` + +Fungsi v0.3 +: `FILTER_DROP_ROWS()` | `FILTER_DROP_COLUMNS()` + +Fungsi `DROP*()` bertujuan untuk menghapus baris/kolom tertentu dari data. Fungsi tersebut dibuat karena saat ini belum ada fungsinya, yang telah tersedia kebalikannya yaitu mengambil kolom/baris tertentu dengan `CHOOSE*()`. Penggunaan di v0.3 sama saja dengan v0.2, yang berubah **hanya nama fungsinya**. Jadi dari `DROPROWS(array, index_to_drop)` menjadi `FILTER_DROP_ROWS(array, row_index)` dan `DROPCOLS(array, index_to_drop)` menjadi `FILTER_DROP_COLUMNS(array, column_index)`. + diff --git a/styles.css b/styles.css index 12ee834..1394110 100644 --- a/styles.css +++ b/styles.css @@ -1,5 +1,18 @@ /* css styles */ +@import url('https://fonts.googleapis.com/css2?family=Fira+Code'); + +code { + font-family: 'Fira Code', monospace; +} .figure-caption { text-align: center; +} + +.justify { + text-align: justify; +} + +.syntax { + font-family: 'Fira Code', monospace; } \ No newline at end of file