Index: mojo/public/dart/third_party/barback/lib/src/graph/group_runner.dart |
diff --git a/mojo/public/dart/third_party/barback/lib/src/graph/group_runner.dart b/mojo/public/dart/third_party/barback/lib/src/graph/group_runner.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f9dcaa11c0397667c2f289f6693f1aca040be355 |
--- /dev/null |
+++ b/mojo/public/dart/third_party/barback/lib/src/graph/group_runner.dart |
@@ -0,0 +1,89 @@ |
+// Copyright (c) 2013, 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. |
+ |
+library barback.graph.group_runner; |
+ |
+import 'dart:async'; |
+ |
+import '../asset/asset_node.dart'; |
+import '../log.dart'; |
+import '../transformer/transformer_group.dart'; |
+import '../utils/stream_pool.dart'; |
+import 'node_status.dart'; |
+import 'phase.dart'; |
+ |
+/// A class that processes all of the phases in a single transformer group. |
+/// |
+/// A group takes many inputs, processes them, and emits many outputs. |
+class GroupRunner { |
+ /// The group this runner runs. |
+ final TransformerGroup _group; |
+ |
+ /// A string describing the location of [this] in the transformer graph. |
+ final String _location; |
+ |
+ /// The phases defined by this group. |
+ final _phases = new List<Phase>(); |
+ |
+ /// How far along [this] is in processing its assets. |
+ NodeStatus get status { |
+ // Just check the last phase, since it will check all the previous phases |
+ // itself. |
+ return _phases.last.status; |
+ } |
+ |
+ /// A stream that emits an event every time the group's status changes. |
+ Stream<NodeStatus> get onStatusChange => _onStatusChange; |
+ Stream _onStatusChange; |
+ |
+ /// A stream that emits any new assets emitted by [this]. |
+ /// |
+ /// Assets are emitted synchronously to ensure that any changes are thoroughly |
+ /// propagated as soon as they occur. |
+ Stream<AssetNode> get onAsset => _onAsset; |
+ Stream<AssetNode> _onAsset; |
+ |
+ /// A stream that emits an event whenever any transforms in this group logs |
+ /// an entry. |
+ Stream<LogEntry> get onLog => _onLogPool.stream; |
+ final _onLogPool = new StreamPool<LogEntry>.broadcast(); |
+ |
+ GroupRunner(Phase previous, this._group, this._location) { |
+ _addPhase(previous.addPhase(_location), []); |
+ for (var phase in _group.phases) { |
+ _addPhase(_phases.last.addPhase(), phase); |
+ } |
+ |
+ _onAsset = _phases.last.onAsset; |
+ _onStatusChange = _phases.last.onStatusChange; |
+ } |
+ |
+ /// Add a phase with [contents] to [this]'s list of phases. |
+ /// |
+ /// [contents] should be an inner [Iterable] from a [TransformGroup.phases] |
+ /// value. |
+ void _addPhase(Phase phase, Iterable contents) { |
+ _phases.add(phase); |
+ _onLogPool.add(phase.onLog); |
+ phase.updateTransformers(contents); |
+ } |
+ |
+ /// Force all [LazyTransformer]s' transforms in this group to begin producing |
+ /// concrete assets. |
+ void forceAllTransforms() { |
+ for (var phase in _phases) { |
+ phase.forceAllTransforms(); |
+ } |
+ } |
+ |
+ /// Removes this group and all sub-phases within it. |
+ void remove() { |
+ _onLogPool.close(); |
+ for (var phase in _phases) { |
+ phase.remove(); |
+ } |
+ } |
+ |
+ String toString() => "group in phase $_location for $_group"; |
+} |