Completed
Push — dev ( ffd8f7...ec8098 )
by Fike
51s
created

Path.each()   A

Complexity

Conditions 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 5
rs 9.4285
cc 1
1
# frozen_string_literal: true
2
3
require_relative 'path/segment'
4
5
module AMA
6
  module Entity
7
    class Mapper
8
      # Wrapper for simple array. Helps to understand where exactly processing
9
      # is taking place.
10
      class Path
11
        attr_reader :segments
12
13
        def initialize(stack = [])
14
          @segments = stack
15
        end
16
17
        def empty?
18
          @segments.empty?
19
        end
20
21
        # @param [String, Symbol, Integer] name
22
        # @return [AMA::Entity::Mapper::Path]
23
        def index(name)
24
          push(Segment.index(name))
25
        end
26
27
        # @param [String, Symbol] name
28
        # @return [AMA::Entity::Mapper::Path]
29
        def attribute(name)
30
          push(Segment.attribute(name))
31
        end
32
33
        # @param [String, Symbol] name
34
        # @return [AMA::Entity::Mapper::Path]
35
        def property(name)
36
          push(Segment.property(name))
37
        end
38
39
        # @param [Array<AMA::Entity::Mapper::Path::Segment>] segments
40
        # @return [AMA::Entity::Mapper::Path]
41
        def push(*segments)
42
          segments = segments.map do |segment|
43
            next segment if segment.is_a?(Segment)
44
            Segment.attribute(segment)
45
          end
46
          self.class.new(@segments + segments)
47
        end
48
49
        # @return [AMA::Entity::Mapper::Path]
50
        def pop
51
          self.class.new(@segments[0..-2])
52
        end
53
54
        # @return [AMA::Entity::Mapper::Path::Segment]
55
        def current
56
          @segments.last
57
        end
58
59
        def each
60
          @segments.each do |item|
61
            yield(item)
62
          end
63
        end
64
65
        def reduce(carrier)
66
          @segments.reduce(carrier) do |inner_carrier, item|
67
            yield(inner_carrier, item)
68
          end
69
        end
70
71
        # @param [AMA::Entity::Mapper::Path] path
72
        # @return [AMA::Entity::Mapper::Path]
73
        def merge(path)
74
          push(*path.segments)
75
        end
76
77
        def size
78
          @segments.size
79
        end
80
81
        # @return [Array<AMA::Entity::Mapper::Path::Segment>]
82
        def to_a
83
          @segments.clone
84
        end
85
86
        # @return [String]
87
        def to_s
88
          "$#{@segments.join}"
89
        end
90
      end
91
    end
92
  end
93
end
94