Class: Micro::Case::Flow::Reducer

Inherits:
Object
  • Object
show all
Defined in:
lib/micro/case/flow/reducer.rb

Direct Known Subclasses

Safe::Flow::Reducer

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(use_cases) ⇒ Reducer

Returns a new instance of Reducer.



24
25
26
# File 'lib/micro/case/flow/reducer.rb', line 24

def initialize(use_cases)
  @use_cases = use_cases
end

Instance Attribute Details

#use_casesObject (readonly)

Returns the value of attribute use_cases.



7
8
9
# File 'lib/micro/case/flow/reducer.rb', line 7

def use_cases
  @use_cases
end

Class Method Details

.build(args) ⇒ Object



16
17
18
19
20
21
22
# File 'lib/micro/case/flow/reducer.rb', line 16

def self.build(args)
  use_cases = Array(args).flat_map { |arg| map_use_cases(arg) }

  raise Error::InvalidUseCases if use_cases.any? { |klass| !(klass < ::Micro::Case) }

  new(use_cases)
end

.map_use_cases(arg) ⇒ Object



9
10
11
12
13
14
# File 'lib/micro/case/flow/reducer.rb', line 9

def self.map_use_cases(arg)
  return arg.use_cases if arg.is_a?(Reducer)
  return arg.__flow__.use_cases if arg.is_a?(Class) && arg < ::Micro::Case::Flow

  Array(arg)
end

Instance Method Details

#&(arg) ⇒ Object

Raises:

  • (NoMethodError)


45
46
47
# File 'lib/micro/case/flow/reducer.rb', line 45

def &(arg)
  raise NoMethodError, "undefined method `&' for #{self.inspect}. Please, use the method `>>' to avoid this error."
end

#>>(arg) ⇒ Object



41
42
43
# File 'lib/micro/case/flow/reducer.rb', line 41

def >>(arg)
  self.class.build(use_cases + self.class.map_use_cases(arg))
end

#call(arg = {}) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/micro/case/flow/reducer.rb', line 28

def call(arg = {})
  memo = arg.is_a?(Hash) ? arg.dup : {}

  @use_cases.reduce(initial_result(arg)) do |result, use_case|
    break result if result.failure?

    value = result.value
    input = value.is_a?(Hash) ? memo.tap { |data| data.merge!(value) } : value

    use_case_result(use_case, result, input)
  end
end

#to_procObject



49
50
51
# File 'lib/micro/case/flow/reducer.rb', line 49

def to_proc
  Proc.new { |arg| call(arg) }
end