-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbase_data_extension.dart
49 lines (42 loc) · 1.78 KB
/
base_data_extension.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import 'package:das_client/model/journey/balise_level_crossing_group.dart';
import 'package:das_client/model/journey/base_data.dart';
import 'package:das_client/model/journey/datatype.dart';
extension BaseDataExtension on Iterable<BaseData> {
List<BaseData> groupBaliseAndLeveLCrossings(List<int> expandedGroups) {
final List<BaseData> resultList = [];
for (int i = 0; i < length; i++) {
final currentElement = elementAt(i);
if (!currentElement.canGroup) {
// Just add elements to the result that are unable to be grouped
resultList.add(currentElement);
continue;
}
final groupedElements = [currentElement];
// check the next elements if they can be grouped with the currentElement.
for (int j = i + 1; j < length; j++) {
final nextElement = elementAt(j);
if (nextElement.canGroup && currentElement.canGroupWith(nextElement)) {
groupedElements.add(nextElement);
} else {
// Stop once we reach a element that is unable to be grouped
break;
}
}
if (groupedElements.length > 1 && [Datatype.balise, Datatype.levelCrossing].contains(currentElement.type)) {
// Add a group header if we have more then 1 element
final group = BaliseLevelCrossingGroup(
order: groupedElements[0].order, kilometre: groupedElements[0].kilometre, groupedElements: groupedElements);
resultList.add(group);
// Add all the elements if the group is currently expanded
if (expandedGroups.contains(group.order)) {
resultList.addAll(groupedElements);
}
// skip already checked elements
i += groupedElements.length - 1;
} else {
resultList.add(currentElement);
}
}
return resultList;
}
}