distinctUntilChanged.lua 933 B

123456789101112131415161718192021222324252627282930313233
  1. local Observable = require 'observable'
  2. local util = require 'util'
  3. --- Returns an Observable that only produces values from the original if they are different from
  4. -- the previous value.
  5. -- @arg {function} comparator - A function used to compare 2 values. If unspecified, == is used.
  6. -- @returns {Observable}
  7. function Observable:distinctUntilChanged(comparator)
  8. comparator = comparator or util.eq
  9. return Observable.create(function(observer)
  10. local first = true
  11. local currentValue = nil
  12. local function onNext(value, ...)
  13. if first or not comparator(value, currentValue) then
  14. observer:onNext(value, ...)
  15. currentValue = value
  16. first = false
  17. end
  18. end
  19. local function onError(message)
  20. return observer:onError(message)
  21. end
  22. local function onCompleted()
  23. return observer:onCompleted()
  24. end
  25. return self:subscribe(onNext, onError, onCompleted)
  26. end)
  27. end