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
27
28
# File 'lib/micro/case/flow/reducer.rb', line 24

def initialize(use_cases)
  @use_cases = use_cases
  @first_use_case = use_cases[0]
  @next_use_cases = use_cases[1..-1]
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)


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

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

#>>(arg) ⇒ Object



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

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

#call(arg = {}) ⇒ Object



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

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

  first_result = first_use_case_result(arg)

  return first_result if @next_use_cases.empty?

  next_use_cases_result(first_result, memo)
end

#to_procObject



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

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