Sha256: 8996949feb001c77249ba96c296bbfc294a375ec12962e163429b8ac64be6a1a

Contents?: true

Size: 1.22 KB

Versions: 21

Compression:

Stored size: 1.22 KB

Contents

class Reline::KeyStroke
  using Module.new {
    refine Array do
      def start_with?(other)
        other.size <= size && other == self.take(other.size)
      end

      def bytes
        self
      end
    end
  }

  def initialize(config)
    @config = config
  end

  def match_status(input)
    key_mapping.keys.select { |lhs|
      lhs.start_with? input
    }.tap { |it|
      return :matched  if it.size == 1 && (it.max_by(&:size)&.size&.== input.size)
      return :matching if it.size == 1 && (it.max_by(&:size)&.size&.!= input.size)
      return :matched  if it.max_by(&:size)&.size&.< input.size
      return :matching if it.size > 1
    }
    key_mapping.keys.select { |lhs|
      input.start_with? lhs
    }.tap { |it|
      return it.size > 0 ? :matched : :unmatched
    }
  end

  def expand(input)
    lhs = key_mapping.keys.select { |item| input.start_with? item }.sort_by(&:size).reverse.first
    return input unless lhs
    rhs = key_mapping[lhs]

    case rhs
    when String
      rhs_bytes = rhs.bytes
      expand(expand(rhs_bytes) + expand(input.drop(lhs.size)))
    when Symbol
      [rhs] + expand(input.drop(lhs.size))
    when Array
      rhs
    end
  end

  private

  def key_mapping
    @config.key_bindings
  end
end

Version data entries

21 entries across 21 versions & 1 rubygems

Version Path
reline-0.2.8.pre.7 lib/reline/key_stroke.rb
reline-0.2.8.pre.6 lib/reline/key_stroke.rb
reline-0.2.8.pre.5 lib/reline/key_stroke.rb
reline-0.2.8.pre.4 lib/reline/key_stroke.rb
reline-0.2.8.pre.3 lib/reline/key_stroke.rb
reline-0.2.8.pre.2 lib/reline/key_stroke.rb
reline-0.2.8.pre.1 lib/reline/key_stroke.rb
reline-0.2.7 lib/reline/key_stroke.rb
reline-0.2.6 lib/reline/key_stroke.rb
reline-0.2.5 lib/reline/key_stroke.rb
reline-0.2.4 lib/reline/key_stroke.rb
reline-0.2.3 lib/reline/key_stroke.rb
reline-0.2.2 lib/reline/key_stroke.rb
reline-0.2.1 lib/reline/key_stroke.rb
reline-0.2.0 lib/reline/key_stroke.rb
reline-0.1.10 lib/reline/key_stroke.rb
reline-0.1.9 lib/reline/key_stroke.rb
reline-0.1.8 lib/reline/key_stroke.rb
reline-0.1.7 lib/reline/key_stroke.rb
reline-0.1.6 lib/reline/key_stroke.rb