Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(243)

Unified Diff: pkg/barback/lib/src/asset_node.dart

Issue 149243009: Add support for lazy transformers. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: code review Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/barback/lib/src/asset_cascade.dart ('k') | pkg/barback/lib/src/base_transform.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/barback/lib/src/asset_node.dart
diff --git a/pkg/barback/lib/src/asset_node.dart b/pkg/barback/lib/src/asset_node.dart
index 7ea442abbd5f08362ce8d23ff0005b723a7dda9a..c4aec846a054e33ac5bb588531bee94d30874709 100644
--- a/pkg/barback/lib/src/asset_node.dart
+++ b/pkg/barback/lib/src/asset_node.dart
@@ -50,6 +50,14 @@ class AssetNode {
Asset get asset => _asset;
Asset _asset;
+ /// The callback to be called to notify this asset node's creator that the
+ /// concrete asset should be generated.
+ ///
+ /// This is null for non-lazy asset nodes (see [AssetNodeController.lazy]).
+ /// Once this is called, it's set to null and [this] is no longer considered
+ /// lazy.
+ Function _lazyCallback;
+
/// A broadcast stream that emits an event whenever the node changes state.
///
/// This stream is synchronous to ensure that when a source asset is modified
@@ -138,7 +146,24 @@ class AssetNode {
_asset = asset,
_state = AssetState.AVAILABLE;
- String toString() => "$state asset $id";
+ AssetNode._lazy(this.id, this._transform, this._origin, this._lazyCallback)
+ : _state = AssetState.DIRTY;
+
+ /// If [this] is lazy, force it to generate a concrete asset; otherwise, do
+ /// nothing.
+ ///
+ /// See [AssetNodeController.lazy].
+ void force() {
+ if (_origin != null) {
+ _origin.force();
+ } else if (_lazyCallback != null) {
+ _lazyCallback();
+ _lazyCallback = null;
+ }
+ }
+
+ String toString() =>
+ "$state${_lazyCallback == null ? '' : ' lazy'} asset $id";
}
/// The controller for an [AssetNode].
@@ -156,11 +181,26 @@ class AssetNodeController {
AssetNodeController.available(Asset asset, [TransformNode transform])
: node = new AssetNode._available(asset, transform, null);
+ /// Creates a controller for a lazy node.
+ ///
+ /// For the most part, this node works like any other dirty node. However, the
+ /// owner of its controller isn't expected to do the work to make it available
+ /// as soon as possible like they would for a non-lazy node. Instead, when its
+ /// value is needed, [callback] will fire to indicate that it should be made
+ /// available as soon as possible.
+ ///
+ /// [callback] is guaranteed to only fire once.
+ AssetNodeController.lazy(AssetId id, void callback(),
+ [TransformNode transform])
+ : node = new AssetNode._lazy(id, transform, null, callback);
+
/// Creates a controller for a node whose initial state matches the current
/// state of [node].
///
/// [AssetNode.origin] of the returned node will automatically be set to
/// `node.origin`.
+ ///
+ /// If [node] is lazy, the returned node will also be lazy.
AssetNodeController.from(AssetNode node)
: node = new AssetNode._(node.id, node.transform, node.origin) {
if (node.state.isAvailable) {
@@ -175,6 +215,7 @@ class AssetNodeController {
assert(node._state != AssetState.REMOVED);
node._state = AssetState.DIRTY;
node._asset = null;
+ node._lazyCallback = null;
node._stateChangeController.add(AssetState.DIRTY);
}
@@ -186,6 +227,7 @@ class AssetNodeController {
assert(node._state != AssetState.REMOVED);
node._state = AssetState.REMOVED;
node._asset = null;
+ node._lazyCallback = null;
node._stateChangeController.add(AssetState.REMOVED);
}
@@ -199,9 +241,25 @@ class AssetNodeController {
assert(node._state != AssetState.AVAILABLE);
node._state = AssetState.AVAILABLE;
node._asset = asset;
+ node._lazyCallback = null;
node._stateChangeController.add(AssetState.AVAILABLE);
}
+ /// Marks the node as [AssetState.DIRTY] and lazy.
+ ///
+ /// Lazy nodes aren't expected to have their values generated until needed.
+ /// Once it's necessary, [callback] will be called. [callback] is guaranteed
+ /// to be called only once.
+ ///
+ /// See also [AssetNodeController.lazy].
+ void setLazy(void callback()) {
+ assert(node._state != AssetState.REMOVED);
+ node._state = AssetState.DIRTY;
+ node._asset = null;
+ node._lazyCallback = callback;
+ node._stateChangeController.add(AssetState.DIRTY);
+ }
+
String toString() => "controller for $node";
}
« no previous file with comments | « pkg/barback/lib/src/asset_cascade.dart ('k') | pkg/barback/lib/src/base_transform.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698