Skip to content

Instantly share code, notes, and snippets.

@johansson
Last active December 13, 2020 00:07
Show Gist options
  • Save johansson/6e40e1c02032f1b4c2e46b351a5cbe0c to your computer and use it in GitHub Desktop.
Save johansson/6e40e1c02032f1b4c2e46b351a5cbe0c to your computer and use it in GitHub Desktop.
/*
* Copyright (C) 2020 by Will Johansson
*
* Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING
* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL,
* DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
* WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
* USE OR PERFORMANCE OF THIS SOFTWARE.
*/
enum Change<T> {
case initial(T)
case delta(previous: T, current: T)
}
extension ObservableType {
/*
* Get latest two from an observable.
*/
func updates() -> Observable<(Element, Element)> {
scan([]) { ($0 + [$1]).suffix(2) }
.skip { $0.count < 2 }
.map { ($0[0], $0[1]) }
}
/*
* Get state of the change from an observable.
*/
func change() -> Observable<Change<Element>> {
scan([]) { ($0 + [$1]).suffix(2) }
.map { $0.count == 1 ? .initial($0[0]) : .delta(previous: $0[0], current: $0[1]) }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment