# ObservableList module `ObservableList` lives in explicit module `lyng.observable`. Import it first: import lyng.observable >>> void Create from a regular mutable list: import lyng.observable val xs = [1,2,3].observable() assert(xs is ObservableList) assertEquals([1,2,3], xs) >>> void ## Hook flow Event order is: 1. `beforeChange(change)` listeners 2. mutation commit 3. `onChange(change)` listeners 4. `changes()` flow emission Rejection is done by throwing in `beforeChange`. import lyng.observable val xs = [1,2].observable() xs.beforeChange { throw ChangeRejectionException("no mutation") } assertThrows(ChangeRejectionException) { xs += 3 } assertEquals([1,2], xs) >>> void ## Subscriptions `beforeChange` and `onChange` return `Subscription`. Call `cancel()` to unsubscribe. import lyng.observable val xs = [1].observable() var hits = 0 val sub = xs.onChange { hits++ } xs += 2 sub.cancel() xs += 3 assertEquals(1, hits) >>> void ## Change events `changes()` returns `Flow>` with concrete event classes: - `ListInsert` - `ListSet` - `ListRemove` - `ListClear` - `ListReorder` import lyng.observable val xs = [10,20].observable() val it = xs.changes().iterator() xs[1] = 200 val ev = it.next() assert(ev is ListSet) assertEquals(20, (ev as ListSet).oldValue) assertEquals(200, ev.newValue) it.cancelIteration() >>> void