Class: ConvenientService::Utils::Proc::Conjunct

Inherits:
Support::Command show all
Defined in:
lib/convenient_service/utils/proc/conjunct.rb

Overview

TODO: Compose.

TODO: Disjunct.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Support::Command

[], call

Constructor Details

#initialize(procs) ⇒ Conjunct

Returns a new instance of Conjunct.



14
15
16
# File 'lib/convenient_service/utils/proc/conjunct.rb', line 14

def initialize(procs)
  @procs = procs
end

Instance Attribute Details

#procsObject (readonly)

Returns the value of attribute procs.



12
13
14
# File 'lib/convenient_service/utils/proc/conjunct.rb', line 12

def procs
  @procs
end

Instance Method Details

#callObject

Creates a conjunction of procs. All procs should accept only one argument.

For example, let’s assume we have two arbitrary functions:

f(x) and g(x)

Application of the ‘conjunct` procedure gives a new function h(x) that can be written as follows:

h(x) = f(x) && g(x)

IMPORTANT: Please, learn what is a conjunction before diving into implementation details.



31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/convenient_service/utils/proc/conjunct.rb', line 31

def call
  return ->(item) {} if procs.none?

  return procs.first if procs.one?

  ##
  # NOTE: reduce tries to use first element as its initial value if not specified explicitly.
  # https://ruby-doc.org/core-2.6/Enumerable.html#method-i-reduce
  #
  # NOTE: proc can be called by `[]`.
  # https://ruby-doc.org/core-2.7.1/Proc.html#method-i-5B-5D
  #
  procs.reduce(->(item) { true }) { |conjunction, proc| ->(item) { conjunction[item] && proc[item] } }
end