# class SyntaxSuggest::ScanHistory

Scans up/down from the given block

You can try out a change, stash it, or commit it to save for later

Example:

    scanner = ScanHistory.new(code_lines: code_lines, block: block)
    scanner.scan(
      up: ->(_, _, _) { true },
      down: ->(_, _, _) { true }
    )
    scanner.changed? # => true
    expect(scanner.lines).to eq(code_lines)

    scanner.stash_changes

    expect(scanner.lines).to_not eq(code_lines)

### Attributes

after_index[R]
before_index[R]

### Public Class Methods

new(code_lines:, block:) click to toggle source

    # File lib/syntax_suggest/scan_history.rb, line 24
    def initialize(code_lines:, block:)
      @code_lines = code_lines
      @history = [block]
      refresh_index
    end

### Public Instance Methods

changed?() click to toggle source

    # File lib/syntax_suggest/scan_history.rb, line 56
    def changed?
      @before_index != current.lines.first.index ||
        @after_index != current.lines.last.index
    end

commit_if_changed() click to toggle source

    # File lib/syntax_suggest/scan_history.rb, line 30
    def commit_if_changed
      if changed?
        @history << CodeBlock.new(lines: @code_lines[before_index..after_index])
      end

      self
    end

lines() click to toggle source

    # File lib/syntax_suggest/scan_history.rb, line 110
    def lines
      @code_lines[@before_index..@after_index]
    end

next_down() click to toggle source

    # File lib/syntax_suggest/scan_history.rb, line 104
    def next_down
      return nil if @after_index >= @code_lines.length

      @code_lines[@after_index + 1]
    end

next_up() click to toggle source

    # File lib/syntax_suggest/scan_history.rb, line 98
    def next_up
      return nil if @before_index <= 0

      @code_lines[@before_index - 1]
    end

revert_last_commit() click to toggle source

Discard changes that have not been committed and revert the last commit

Cannot revert the first commit

    # File lib/syntax_suggest/scan_history.rb, line 47
    def revert_last_commit
      if @history.length > 1
        @history.pop
        refresh_index
      end

      self
    end

scan(up:, down:) click to toggle source

Iterates up and down

Returns line, kw_count, end_count for each iteration

    # File lib/syntax_suggest/scan_history.rb, line 64
    def scan(up:, down:)
      kw_count = 0
      end_count = 0

      up_index = before_lines.reverse_each.take_while do |line|
        kw_count += 1 if line.is_kw?
        end_count += 1 if line.is_end?
        up.call(line, kw_count, end_count)
      end.last&.index

      kw_count = 0
      end_count = 0

      down_index = after_lines.each.take_while do |line|
        kw_count += 1 if line.is_kw?
        end_count += 1 if line.is_end?
        down.call(line, kw_count, end_count)
      end.last&.index

      @before_index = if up_index && up_index < @before_index
        up_index
      else
        @before_index
      end

      @after_index = if down_index && down_index > @after_index
        down_index
      else
        @after_index
      end

      self
    end

stash_changes() click to toggle source

Discards any changes that have not been committed

    # File lib/syntax_suggest/scan_history.rb, line 39
    def stash_changes
      refresh_index
      self
    end

### Private Instance Methods

after_lines() click to toggle source

Returns an array of all the CodeLines that exist after the currently scanned block

    # File lib/syntax_suggest/scan_history.rb, line 120
            def after_lines
      @code_lines[@after_index.next..] || []
    end

before_lines() click to toggle source

    # File lib/syntax_suggest/scan_history.rb, line 114
            def before_lines
      @code_lines[0...@before_index] || []
    end

current() click to toggle source

    # File lib/syntax_suggest/scan_history.rb, line 124
            def current
      @history.last
    end

refresh_index() click to toggle source

    # File lib/syntax_suggest/scan_history.rb, line 128
            def refresh_index
      @before_index = current.lines.first.index
      @after_index = current.lines.last.index
      self
    end