class Reacto::Operations::FlattenLabeled

Public Class Methods

new(accumulator = nil, initial = NO_VALUE) click to toggle source
# File lib/reacto/operations/flatten_labeled.rb, line 9
def initialize(accumulator = nil, initial = NO_VALUE)
  @accumulator = accumulator
  @initial = initial
end

Public Instance Methods

call(tracker) click to toggle source
# File lib/reacto/operations/flatten_labeled.rb, line 14
def call(tracker)
  value = -> (v) do
    unless v.is_a?(LabeledTrackable)
      tracker.on_error(ArgumentError.new(
        'Trackable#flatten_labeled expects all values emitted by the ' \
        'source Trackable to be LabeledTrackable instances.'
      ))
      return
    end

    labeled_trackable =
      if @accumulator.nil?
        v.first
      else
        v.inject(@initial, &@accumulator).last
      end

    accumulated = []
    labeled_trackable.on(value: ->(val) { accumulated << val })
    tracker.on_value(
      OpenStruct.new({ label: v.label, value: accumulated.first })
    )
  end

  Subscriptions::OperationSubscription.new(
    tracker, value: value
  )
end