buildStdCollectionsModule function
Builds the std_collections base module.
Implementation
Module buildStdCollectionsModule() {
final module = Module()
..name = 'std_collections'
..description =
'Standard collections module. List and map operations. '
'Separate from std because not all runtimes support mutable '
'collections natively.';
// ============================================================
// Types
// ============================================================
module.typeDefs.addAll(
<google.DescriptorProto>[
_type('ListInput', [
_exprField('list', 1),
_exprField('index', 2),
_exprField('value', 3),
]),
_type('ListCallbackInput', [
_exprField('list', 1),
_exprField('callback', 2),
]),
_type('ListReduceInput', [
_exprField('list', 1),
_exprField('callback', 2),
_exprField('initial', 3),
]),
_type('ListSliceInput', [
_exprField('list', 1),
_exprField('start', 2),
_exprField('end', 3),
]),
_type('MapInput', [
_exprField('map', 1),
_exprField('key', 2),
_exprField('value', 3),
]),
_type('MapCallbackInput', [
_exprField('map', 1),
_exprField('callback', 2),
]),
_type('StringJoinInput', [
_exprField('list', 1),
_exprField('separator', 2),
]),
_type('SetInput', [_exprField('set', 1), _exprField('value', 2)]),
_type('SetCallbackInput', [
_exprField('set', 1),
_exprField('callback', 2),
]),
_type('SetBinaryInput', [_exprField('left', 1), _exprField('right', 2)]),
].map(
(d) => TypeDefinition()
..name = d.name
..descriptor = d,
),
);
// ============================================================
// Functions — list operations
// ============================================================
module.functions.addAll([
// List — indexed, ordered
_fn('list_push', 'ListInput', '', 'Append to list: list.add(value)'),
_fn('list_pop', 'ListInput', '', 'Remove last: list.removeLast()'),
_fn(
'list_insert',
'ListInput',
'',
'Insert at index: list.insert(index, value)',
),
_fn(
'list_remove_at',
'ListInput',
'',
'Remove at index: list.removeAt(index)',
),
_fn('list_get', 'ListInput', '', 'Get element: list[index]'),
_fn('list_set', 'ListInput', '', 'Set element: list[index] = value'),
_fn('list_length', 'ListInput', '', 'List length: list.length'),
_fn('list_is_empty', 'ListInput', '', 'Is empty: list.isEmpty'),
_fn('list_first', 'ListInput', '', 'First element: list.first'),
_fn('list_last', 'ListInput', '', 'Last element: list.last'),
_fn('list_single', 'ListInput', '', 'Single element: list.single'),
_fn(
'list_contains',
'ListInput',
'',
'Contains element: list.contains(value)',
),
_fn(
'list_index_of',
'ListInput',
'',
'Index of element: list.indexOf(value)',
),
_fn('list_map', 'ListCallbackInput', '', 'Map: list.map(callback)'),
_fn('list_filter', 'ListCallbackInput', '', 'Filter: list.where(callback)'),
_fn(
'list_reduce',
'ListReduceInput',
'',
'Reduce: list.fold(initial, callback)',
),
_fn(
'list_find',
'ListCallbackInput',
'',
'Find first: list.firstWhere(callback)',
),
_fn('list_any', 'ListCallbackInput', '', 'Any match: list.any(callback)'),
_fn('list_all', 'ListCallbackInput', '', 'All match: list.every(callback)'),
_fn(
'list_none',
'ListCallbackInput',
'',
'None match: !list.any(callback)',
),
_fn('list_sort', 'ListCallbackInput', '', 'Sort: list.sort(compare)'),
_fn(
'list_sort_by',
'ListCallbackInput',
'',
'Sort by key: list.sort((a,b) => key(a).compareTo(key(b)))',
),
_fn('list_reverse', 'ListInput', '', 'Reverse: list.reversed.toList()'),
_fn('list_slice', 'ListSliceInput', '', 'Slice: list.sublist(start, end)'),
_fn(
'list_flat_map',
'ListCallbackInput',
'',
'Flat map: list.expand(callback)',
),
_fn('list_zip', 'ListInput', '', 'Zip two lists: zip(list, other)'),
_fn('list_take', 'ListInput', '', 'Take N: list.take(n)'),
_fn('list_drop', 'ListInput', '', 'Drop N: list.skip(n)'),
_fn('list_concat', 'ListInput', '', 'Concat two lists: list + other'),
_fn('list_clear', 'ListInput', '', 'Remove all elements: list.clear()'),
_fn('list_to_list', 'ListInput', '', 'Copy to a list: list.toList()'),
_fn(
'list_foreach',
'ListCallbackInput',
'',
'Iterate: list.forEach(callback)',
),
_fn(
'list_join',
'StringJoinInput',
'',
'Join elements: list.join(separator)',
),
// Map — key/value
_fn('map_get', 'MapInput', '', 'Get value: map[key]'),
_fn('map_set', 'MapInput', '', 'Set value: map[key] = value'),
_fn('map_delete', 'MapInput', '', 'Delete key: map.remove(key)'),
_fn(
'map_contains_key',
'MapInput',
'',
'Contains key: map.containsKey(key)',
),
_fn('map_keys', 'MapInput', '', 'All keys: map.keys'),
_fn('map_values', 'MapInput', '', 'All values: map.values'),
_fn('map_entries', 'MapInput', '', 'All entries: map.entries'),
_fn(
'map_from_entries',
'ListInput',
'',
'Map from entries: Map.fromEntries(list)',
),
_fn('map_merge', 'MapInput', '', 'Merge two maps: {...a, ...b}'),
_fn('map_map', 'MapCallbackInput', '', 'Map over map: map.map(callback)'),
_fn(
'map_filter',
'MapCallbackInput',
'',
'Filter map: Map.fromEntries(map.entries.where(callback))',
),
_fn(
'map_contains_value',
'MapInput',
'',
'Contains value: map.containsValue(value)',
),
_fn(
'map_put_if_absent',
'MapInput',
'',
'Insert if absent: map.putIfAbsent(key, () => value)',
),
_fn('map_is_empty', 'MapInput', '', 'Is empty: map.isEmpty'),
_fn('map_length', 'MapInput', '', 'Map size: map.length'),
// String ↔ collection bridge
_fn(
'string_join',
'StringJoinInput',
'',
'Join list of strings: list.join(separator)',
),
// Set — unordered, unique elements
_fn('set_create', 'ListInput', '', 'Create set from list: Set.from(list)'),
_fn('set_add', 'SetInput', '', 'Add element: set.add(value)'),
_fn('set_remove', 'SetInput', '', 'Remove element: set.remove(value)'),
_fn(
'set_contains',
'SetInput',
'',
'Contains element: set.contains(value)',
),
_fn('set_union', 'SetBinaryInput', '', 'Union: left.union(right)'),
_fn(
'set_intersection',
'SetBinaryInput',
'',
'Intersection: left.intersection(right)',
),
_fn(
'set_difference',
'SetBinaryInput',
'',
'Difference: left.difference(right)',
),
_fn('set_length', 'SetInput', '', 'Set size: set.length'),
_fn('set_is_empty', 'SetInput', '', 'Is empty: set.isEmpty'),
_fn('set_to_list', 'SetInput', '', 'To list: set.toList()'),
]);
return module;
}