m3eMenuPartitionSurfaces function

List<M3EMenuGroup> m3eMenuPartitionSurfaces(
  1. List<M3EMenuNode> nodes
)

Partitions top-level menu nodes into elevated surface groups.

Implementation

List<M3EMenuGroup> m3eMenuPartitionSurfaces(List<M3EMenuNode> nodes) {
  if (nodes.isEmpty) {
    return const <M3EMenuGroup>[];
  }
  final surfaces = <M3EMenuGroup>[];
  var flatRun = <M3EMenuNode>[];

  void flushFlat() {
    if (flatRun.isEmpty) {
      return;
    }
    surfaces.add(M3EMenuGroup(children: List<M3EMenuNode>.of(flatRun)));
    flatRun = <M3EMenuNode>[];
  }

  for (final node in nodes) {
    if (node is M3EMenuGroup) {
      flushFlat();
      surfaces.add(node);
    } else {
      flatRun.add(node);
    }
  }
  flushFlat();
  return surfaces;
}