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

Unified Diff: third_party/pkg/angular/lib/change_detection/change_detection.dart

Issue 176943008: Update the Angular/DI tests to latest from github. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: 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
Index: third_party/pkg/angular/lib/change_detection/change_detection.dart
diff --git a/third_party/pkg/angular/lib/change_detection/change_detection.dart b/third_party/pkg/angular/lib/change_detection/change_detection.dart
new file mode 100644
index 0000000000000000000000000000000000000000..5db6300cdf864d5773920e7640df7fbceadaa443
--- /dev/null
+++ b/third_party/pkg/angular/lib/change_detection/change_detection.dart
@@ -0,0 +1,258 @@
+library change_detection;
+
+typedef EvalExceptionHandler(error, stack);
+
+/**
+ * An interface for [ChangeDetectorGroup] groups related watches together. It
+ * guarantees that within the group all watches will be reported in the order in
+ * which they were registered. It also provides an efficient way of removing the
+ * watch group.
+ */
+abstract class ChangeDetectorGroup<H> {
+ /**
+ * Watch a specific [field] on an [object].
+ *
+ * If the [field] is:
+ * - _name_ - Name of the property to watch. (If the [object] is a Map then
+ * treat the name as a key.)
+ * - _[]_ - Watch all items in an array.
+ * - _{}_ - Watch all items in a Map.
+ * - _._ - Watch the actual object identity.
+ *
+ *
+ * Parameters:
+ * - [object] to watch.
+ * - [field] to watch on the [object].
+ * - [handler] an opaque object passed on to [ChangeRecord].
+ */
+ WatchRecord<H> watch(Object object, String field, H handler);
+
+ /** Use to remove all watches in the group in an efficient manner. */
+ void remove();
+
+ /** Create a child [ChangeDetectorGroup] */
+ ChangeDetectorGroup<H> newGroup();
+}
+
+/**
+ * An interface for [ChangeDetector]. An application can have multiple instances
+ * of the [ChangeDetector] to be used for checking different application domains.
+ *
+ * [ChangeDetector] works by comparing the identity of the objects not by
+ * calling the `.equals()` method. This is because ChangeDetector needs to have
+ * predictable performance, and the developer can implement `.equals()` on top
+ * of identity checks.
+ *
+ * - [H] A [ChangeRecord] has associated handler object. The handler object is
+ * opaque to the [ChangeDetector] but it is meaningful to the code which
+ * registered the watcher. It can be a data structure, an object, or a function.
+ * It is up to the developer to attach meaning to it.
+ */
+abstract class ChangeDetector<H> extends ChangeDetectorGroup<H> {
+ /**
+ * This method does the work of collecting the changes and returns them as a
+ * linked list of [ChangeRecord]s. The [ChangeRecord]s are returned in the
+ * same order as they were registered.
+ */
+ ChangeRecord<H> collectChanges({ EvalExceptionHandler exceptionHandler,
+ AvgStopwatch stopwatch });
+}
+
+abstract class Record<H> {
+ /** The observed object. */
+ Object get object;
+
+ /**
+ * The field which is being watched:
+ * - _name_ - Name of the field to watch.
+ * - _[]_ - Watch all items in an array.
+ * - _{}_ - Watch all items in a Map.
+ * - _._ - Watch the actual object identity.
+ */
+ String get field;
+
+ /**
+ * An application provided object which contains the specific logic which
+ * needs to be applied when the change is detected. The handler is opaque to
+ * the ChangeDetector and as such can be anything the application desires.
+ */
+ H get handler;
+
+ /** Current value of the [field] on the [object] */
+ get currentValue;
+ /** Previous value of the [field] on the [object] */
+ get previousValue;
+}
+
+/**
+ * [WatchRecord] API which allows changing what object is being watched and
+ * manually triggering the checking.
+ */
+abstract class WatchRecord<H> extends Record<H> {
+ /** Set a new object for checking */
+ set object(value);
+
+ /**
+ * Check to see if the field on the object has changed. Returns [null] if no
+ * change, or a [ChangeRecord] if a change has been detected.
+ */
+ ChangeRecord<H> check();
+
+ void remove();
+}
+
+/**
+ * Provides information about the changes which were detected in objects.
+ *
+ * It exposes a `nextChange` method for traversing all of the changes.
+ */
+abstract class ChangeRecord<H> extends Record<H> {
+ /** Next [ChangeRecord] */
+ ChangeRecord<H> get nextChange;
+}
+
+/**
+ * If the [ChangeDetector] is watching a [Map] then the [currentValue] of
+ * [Record] will contain an instance of this object. A [MapChangeRecord]
+ * contains the changes to the map since the last execution. The changes are
+ * reported as a list of [MapKeyValue]s which contain the key as well as its
+ * current and previous value.
+ */
+abstract class MapChangeRecord<K, V> {
+ /// The underlying iterable object
+ Map get map;
+
+ /// A list of [CollectionKeyValue]s which are in the iteration order. */
+ KeyValue<K, V> get mapHead;
+ /// A list of changed items.
+ ChangedKeyValue<K, V> get changesHead;
+ /// A list of new added items.
+ AddedKeyValue<K, V> get additionsHead;
+ /// A list of removed items
+ RemovedKeyValue<K, V> get removalsHead;
+
+ void forEachChange(void f(ChangedKeyValue<K, V> change));
+ void forEachAddition(void f(AddedKeyValue<K, V> addition));
+ void forEachRemoval(void f(RemovedKeyValue<K, V> removal));
+}
+
+/**
+ * Each item in map is wrapped in [MapKeyValue], which can track
+ * the [item]s [currentValue] and [previousValue] location.
+ */
+abstract class MapKeyValue<K, V> {
+ /// The item.
+ K get key;
+
+ /// Previous item location in the list or [null] if addition.
+ V get previousValue;
+
+ /// Current item location in the list or [null] if removal.
+ V get currentValue;
+}
+
+abstract class KeyValue<K, V> extends MapKeyValue<K, V> {
+ KeyValue<K, V> get nextKeyValue;
+}
+
+abstract class AddedKeyValue<K, V> extends MapKeyValue<K, V> {
+ AddedKeyValue<K, V> get nextAddedKeyValue;
+}
+
+abstract class RemovedKeyValue<K, V> extends MapKeyValue<K, V> {
+ RemovedKeyValue<K, V> get nextRemovedKeyValue;
+}
+
+abstract class ChangedKeyValue<K, V> extends MapKeyValue<K, V> {
+ ChangedKeyValue<K, V> get nextChangedKeyValue;
+}
+
+
+/**
+ * If the [ChangeDetector] is watching an [Iterable] then the [currentValue] of
+ * [Record] will contain this object. The [CollectionChangeRecord] contains the
+ * changes to the collection since the last execution. The changes are reported
+ * as a list of [CollectionChangeItem]s which contain the item as well as its
+ * current and previous position in the list.
+ */
+abstract class CollectionChangeRecord<V> {
+ /** The underlying iterable object */
+ Iterable get iterable;
+
+ /** A list of [CollectionItem]s which are in the iteration order. */
+ CollectionItem<V> get collectionHead;
+ /** A list of new [AddedItem]s. */
+ AddedItem<V> get additionsHead;
+ /** A list of [MovedItem]s. */
+ MovedItem<V> get movesHead;
+ /** A list of [RemovedItem]s. */
+ RemovedItem<V> get removalsHead;
+
+ void forEachAddition(void f(AddedItem<V> addition));
+ void forEachMove(void f(MovedItem<V> move));
+ void forEachRemoval(void f(RemovedItem<V> removal));
+}
+
+/**
+ * Each changed item in the collection is wrapped in a [CollectionChangeItem],
+ * which tracks the [item]s [currentKey] and [previousKey] location.
+ */
+abstract class CollectionChangeItem<V> {
+ /** Previous item location in the list or [null] if addition. */
+ int get previousIndex;
+
+ /** Current item location in the list or [null] if removal. */
+ int get currentIndex;
+
+ /** The item. */
+ V get item;
+}
+
+/**
+ * Used to create a linked list of collection items. These items are always in
+ * the iteration order of the collection.
+ */
+abstract class CollectionItem<V> extends CollectionChangeItem<V> {
+ CollectionItem<V> get nextCollectionItem;
+}
+
+/**
+ * A linked list of new items added to the collection. These items are always in
+ * the iteration order of the collection.
+ */
+abstract class AddedItem<V> extends CollectionChangeItem<V> {
+ AddedItem<V> get nextAddedItem;
+}
+
+/**
+ * A linked list of items moved in the collection. These items are always in
+ * the iteration order of the collection.
+ */
+abstract class MovedItem<V> extends CollectionChangeItem<V> {
+ MovedItem<V> get nextMovedItem;
+}
+
+/**
+ * A linked list of items removed from the collection. These items are always
+ * in the iteration order of the collection.
+ */
+abstract class RemovedItem<V> extends CollectionChangeItem<V> {
+ RemovedItem<V> get nextRemovedItem;
+}
+
+class AvgStopwatch extends Stopwatch {
+ int _count = 0;
+
+ int get count => _count;
+
+ void reset() {
+ _count = 0;
+ super.reset();
+ }
+
+ int increment(int count) => _count += count;
+
+ double get ratePerMs => elapsedMicroseconds == 0
+ ? 0.0
+ : _count / elapsedMicroseconds * 1000;
+}

Powered by Google App Engine
This is Rietveld 408576698