for testing and deploying your application
for finding and fixing issues
for empowering human code reviews
# frozen_string_literal: true
require_relative 'path/segment'
module AMA
module Entity
class Mapper
# Wrapper for simple array. Helps to understand where exactly processing
# is taking place.
class Path
attr_reader :segments
def initialize(stack = [])
@segments = stack
end
def empty?
@segments.empty?
# @param [String, Symbol, Integer] name
# @return [AMA::Entity::Mapper::Path]
def index(name)
push(Segment.index(name))
# @param [String, Symbol] name
def attribute(name)
push(Segment.attribute(name))
# @param [Array<AMA::Entity::Mapper::Path::Segment>] segments
def push(*segments)
segments = segments.map do |segment|
next segment if segment.is_a?(Segment)
Segment.attribute(segment)
self.class.new(@segments + segments)
def pop
self.class.new(@segments[0..-2])
# @return [AMA::Entity::Mapper::Path::Segment]
def current
@segments.last
def each
@segments.each do |item|
yield(item)
def reduce(carrier)
@segments.reduce(carrier) do |inner_carrier, item|
yield(inner_carrier, item)
# @param [AMA::Entity::Mapper::Path] path
def merge(path)
push(*path.segments)
def size
@segments.size
def segments
@segments.clone
# @return [Array<AMA::Entity::Mapper::Path::Segment>]
def to_a
# @return [String]
def to_s
"$#{@segments.join}"