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

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: Created 6 years, 11 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
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 a1af547ddddc53cedd25b3f6044bf28cdbdad51d..f05c338d6f34505e0b8d56ddb35b1e4ab5b5f5cf 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
+ /// asset should be materialized.
+ ///
+ /// This is only non-null for lazy asset nodes (see
Bob Nystrom 2014/01/30 19:33:44 "only non-null for lazy" -> "null for non-lazy"
nweiz 2014/01/31 03:43:27 Done.
+ /// [AssetNodeController.lazy]). Once this is called, it's set to null and
+ /// [this] is no longer considered lazy.
+ Function _lazyCallback;
Bob Nystrom 2014/01/30 19:33:44 I'm all for using callbacks in barback, but isn't
nweiz 2014/01/31 03:43:27 I chose a callback instead because it's guaranteed
+
/// 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
@@ -137,6 +145,21 @@ class AssetNode {
: id = asset.id,
_asset = asset,
_state = AssetState.AVAILABLE;
+
+ AssetNode._lazy(this.id, this._transform, this._origin, this._lazyCallback)
+ : _state = AssetState.DIRTY;
+
+ /// If [this] is lazy, materialize it; otherwise, do nothing.
+ ///
+ /// See [AssetNodeController.lazy].
+ void materialize() {
+ if (_origin != null) {
+ _origin.materialize();
+ } else if (_lazyCallback != null) {
+ _lazyCallback();
+ _lazyCallback = null;
+ }
+ }
}
/// The controller for an [AssetNode].
@@ -154,11 +177,27 @@ 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 party, this node works like any other dirty node. However,
Bob Nystrom 2014/01/30 19:33:44 I'm always trying to maximize my party too, but he
nweiz 2014/01/31 03:43:27 Done.
+ /// 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.
Bob Nystrom 2014/01/30 19:33:44 they -> it TransformNodes are gender-less, not ge
nweiz 2014/01/31 03:43:27 "They" actually refers to "the owner" here, who is
+ /// 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. If the returned
+ /// node is materialized, [node] will be materialized as well.
AssetNodeController.from(AssetNode node)
: node = new AssetNode._(node.id, node.transform, node.origin) {
if (node.state.isAvailable) {
@@ -173,6 +212,7 @@ class AssetNodeController {
assert(node._state != AssetState.REMOVED);
node._state = AssetState.DIRTY;
node._asset = null;
+ node._lazyCallback = null;
node._stateChangeController.add(AssetState.DIRTY);
}
@@ -184,6 +224,7 @@ class AssetNodeController {
assert(node._state != AssetState.REMOVED);
node._state = AssetState.REMOVED;
node._asset = null;
+ node._lazyCallback = null;
node._stateChangeController.add(AssetState.REMOVED);
}
@@ -197,8 +238,24 @@ 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 it's
Bob Nystrom 2014/01/30 19:33:44 "it's necessary" -> "needed".
nweiz 2014/01/31 03:43:27 Done.
+ /// necessary. 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);
+ }
}
// TODO(nweiz): add an error state.

Powered by Google App Engine
This is Rietveld 408576698