| // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'dart:collection'; |
| |
| import 'utils.dart'; |
| |
| /// A representation of a Graph since none is specified in `lib/`. |
| class Graph { |
| final Map<String, List<String>?> _graph; |
| |
| Graph(this._graph); |
| |
| List<String> edges(String node) => _graph[node] ?? <Never>[]; |
| |
| Iterable<String> get allNodes => _graph.keys; |
| } |
| |
| class BadGraph { |
| final Map<X, List<X>?> _graph; |
| |
| BadGraph(Map<String, List<String>?> values) |
| : _graph = LinkedHashMap(equals: xEquals, hashCode: xHashCode) |
| ..addEntries( |
| values.entries |
| .map((e) => MapEntry(X(e.key), e.value?.map(X.new).toList())), |
| ); |
| |
| List<X> edges(X node) => _graph[node] ?? <Never>[]; |
| |
| Iterable<X> get allNodes => _graph.keys; |
| } |
| |
| /// A representation of a Graph where keys can asynchronously be resolved to |
| /// real values or to edges. |
| class AsyncGraph { |
| final Map<String, List<String>?> graph; |
| |
| AsyncGraph(this.graph); |
| |
| Future<String?> readNode(String node) async => |
| graph.containsKey(node) ? node : null; |
| |
| Future<Iterable<String>> edges(String key, String? node) async => |
| graph[key] ?? <Never>[]; |
| } |