Class: Ellipses::Client::Lines

Inherits:
SimpleDelegator
  • Object
show all
Defined in:
lib/ellipses/client/lines.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(array_of_lines) ⇒ Lines

Returns a new instance of Lines.



67
68
69
70
71
# File 'lib/ellipses/client/lines.rb', line 67

def initialize(array_of_lines)
  super

  @delegate_sd_obj = array_of_lines
end

Class Method Details

.[](object = nil) ⇒ Object



142
143
144
145
146
147
148
149
150
# File 'lib/ellipses/client/lines.rb', line 142

def [](object = nil)
  case object
  when self       then object
  when Array      then new(object)
  when Enumerator then new(object.to_a)
  when NilClass   then new([])
  else                 new([*object])
  end
end

Instance Method Details

#insertion_by_entropyObject



89
90
91
92
93
94
95
96
97
98
# File 'lib/ellipses/client/lines.rb', line 89

def insertion_by_entropy
  return if empty?

  signature = self[center = index_of_maximum_entropy]
  before    = center
  after     = length - center - 1
  digest    = Support.digest(*self)

  Meta::Insertion.new before: before, after: after, signature: signature, digest: digest
end

#insertion_by_surround(i, before: 0, after: 0) ⇒ Object



80
81
82
83
84
85
86
87
# File 'lib/ellipses/client/lines.rb', line 80

def insertion_by_surround(i, before: 0, after: 0)
  return unless i < length

  signature = self[i]
  digest    = Support.digest(*self[Surround.new(before: before, after: after).range(i)])

  Meta::Insertion.new before: before, after: after, signature: signature, digest: digest
end

#likes(insertion) ⇒ Object



100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/ellipses/client/lines.rb', line 100

def likes(insertion)
  likes = []

  each_with_index do |line, i|
    next unless line == insertion.signature
    next unless (chunk = surrounding_chunk(i, before: insertion.before, after: insertion.after))
    next unless chunk.insertion == insertion

    likes << chunk
  end

  likes
end

#substitute_uniq_like_chunk!(insertion, *lines) ⇒ Object



121
122
123
124
125
# File 'lib/ellipses/client/lines.rb', line 121

def substitute_uniq_like_chunk!(insertion, *lines)
  uniq_like_chunk!(insertion).tap do |chunk|
    substitute_within(chunk.origin_range, *lines)
  end
end

#surrounding_chunk(i, before: 0, after: 0) ⇒ Object



73
74
75
76
77
78
# File 'lib/ellipses/client/lines.rb', line 73

def surrounding_chunk(i, before: 0, after: 0)
  return unless i < length

  range = (surround = Surround.new(before: before, after: after)).range(i)
  Chunk.new self[range], center: surround.center, origin: range.begin
end

#uniq_like_chunk!(insertion) ⇒ Object

Raises:



114
115
116
117
118
119
# File 'lib/ellipses/client/lines.rb', line 114

def uniq_like_chunk!(insertion)
  raise UnfoundError,   "No chunks found like: #{insertion}"       if likes(insertion).empty?
  raise AmbiguousError, "Multiple chunks found like: #{insertion}" unless (likes = likes(insertion)).size == 1

  likes.first
end