Add more details to README (#24)
* Add more details to readme
* Definition of an obsersable
* What's for
* Examples
* Set md headers to same size
* Update readme from Matan's feedback
diff --git a/README.md b/README.md
index c688514..83d79f6 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,82 @@
Support for detecting and being notified when an object is mutated.
+An observable is a way to be notified of a continuous stream of events over time.
+
+Some suggested uses for this library:
+
+* Observe objects for changes, and log when a change occurs
+* Optimize for observable collections in your own APIs and libraries instead of diffing
+* Implement simple data-binding by listening to streams
+
+You may want to look at the former TC39 proposal [Observe.observe](https://github.com/tc39/proposal-observable), which was deprecated.
+
+### Usage
+
There are two general ways to detect changes:
* Listen to `Observable.changes` and be notified when an object changes
* Use `Differ.diff` to determine changes between two objects
+
+### Examples
+
+Operations on Lists:
+
+```dart
+import 'package:observable/observable.dart';
+
+void main() {
+ var changes;
+
+ ObservableList<String> list = new ObservableList<String>.from(['a', 'b', 'c']);
+ StreamSubscription sub = list.listChanges.listen((c) => changes = c);
+
+ ListChangeRecord _delta(
+ int index, {
+ List removed: const [],
+ int addedCount: 0,
+ }) {
+ return new ListChangeRecord(
+ list,
+ index,
+ removed: removed,
+ addedCount: addedCount,
+ );
+ }
+
+ list.insertAll(1, ['y', 'z']); // changes == [_delta(1, addedCount: 2)]
+}
+```
+
+Diffing two maps:
+
+```dart
+import 'package:observable/observable.dart';
+
+void main() {
+ final map1 = {
+ 'key-a': 'value-a',
+ 'key-b': 'value-b-old',
+ };
+
+ final map2 = {
+ 'key-a': 'value-a',
+ 'key-b': 'value-b-new',
+ };
+
+ var diffResult = diff(map1,
+ map2); // [ new MapChangeRecord('key-b', 'value-b-old', 'value-b-new')]
+}
+```
+
+Diffing two sets:
+
+```dart
+import 'package:observable/observable.dart';
+
+void main() {
+ diff(
+ new Set<String>.from(['a', 'b']),
+ new Set<String>.from(['a']),
+ ); // [ new SetChangeRecord.remove('b') ]
+}
+```