\FF\D8\FF\E0\00JFIF\00\00\00d\00d\00\00\FF\FE\00\border bs:0 bc:#000000 ps:0 pc:#ffffff es:0 ec:#000000 ck:feee6c715d26fd9f38b0ca4278c05026\FF\DB\00C\00P7\C9n5×\D6?\BDê\9Ds\EBp\9F[`8m\B7)o\B5\E8\E6I\99\FE3]]A2\BA\8Cw\D6E\93\\DEv\C8\009\F2\F1NI?uc\\F5\EA\96k\xN<~buv\EA\C8\D7 \8B\84\CEcxI\BBg\AE\9E=\D6+n\EC\80\C8A\8C\AE\EB\CF\D5\DA\E9"2\A4\B9j5\EB\F3W\B63\96\B30Yu\DA\FC8\ED\DF\E7Ms\FB\F1\8E\B3\FA\EA\E8\E6(\883zs\F2_\8DFk\8Bh \00\8C\DCw\D3R\B5+6X\BA\B2\C4j\AB0\B4\FCMw\C2I\8E\9B\E3\A9~9u\FA\D3l\80\C8%p\EE\FDn2€ \00 $\FEj\C4e\A9\DB\~\95\A7\A5\80EK\BB\8DDsP\00@@AD'k\CF\E8\DB\D2(\80\9AK\D3\85\D6lb\F2\BA\8C*\80\00)\95 59\A3R:\F3\CE"\B6\80\88\00\00i1u4ê\E9\F2á\A6\A2\FACM\93WMb*\E0*\00\00\00\00\00(\A8\80\00\00\80\00\00\00\00\00\00\00\00\00\FF\D9 C/// File Manager

File Manager

Path: /opt/chef/embedded/lib/ruby/gems/2.7.0/gems/tty-reader-0.7.0/lib/tty/reader/

Viewing File: history.rb

# frozen_string_literal: true

require 'forwardable'

module TTY
  class Reader
    # A class responsible for storing a history of all lines entered by
    # user when interacting with shell prompt.
    #
    # @api private
    class History
      include Enumerable
      extend Forwardable

      # Default maximum size
      DEFAULT_SIZE = 32 << 4

      def_delegators :@history, :size, :length, :to_s, :inspect

      # Set and retrieve the maximum size of the buffer
      attr_accessor :max_size

      attr_reader :index

      attr_accessor :cycle

      attr_accessor :duplicates

      attr_accessor :exclude

      # Create a History buffer
      #
      # param [Integer] max_size
      #   the maximum size for history buffer
      #
      # param [Hash[Symbol]] options
      # @option options [Boolean] :cycle
      #   whether or not the history should cycle, false by default
      # @option options [Boolean] :duplicates
      #   whether or not to store duplicates, true by default
      # @option options [Boolean] :exclude
      #   a Proc to exclude items from storing in history
      #
      # @api public
      def initialize(max_size = DEFAULT_SIZE, **options)
        @max_size   = max_size
        @index      = nil
        @history    = []
        @duplicates = options.fetch(:duplicates) { true }
        @exclude    = options.fetch(:exclude) { proc {} }
        @cycle      = options.fetch(:cycle) { false }
        yield self if block_given?
      end

      # Iterates over history lines
      #
      # @api public
      def each
        if block_given?
          @history.each { |line| yield line }
        else
          @history.to_enum
        end
      end

      # Add the last typed line to history buffer
      #
      # @param [String] line
      #
      # @api public
      def push(line)
        @history.delete(line) unless @duplicates
        return if line.to_s.empty? || @exclude[line]

        @history.shift if size >= max_size
        @history << line
        @index = @history.size - 1

        self
      end
      alias << push

      # Move the pointer to the next line in the history
      #
      # @api public
      def next
        return if size.zero?
        if @index == size - 1
          @index = 0 if @cycle
        else
          @index += 1
        end
      end

      def next?
        size > 0 && !(@index == size - 1 && !@cycle)
      end

      # Move the pointer to the previous line in the history
      def previous
        return if size.zero?
        if @index.zero?
          @index = size - 1 if @cycle
        else
          @index -= 1
        end
      end

      def previous?
        size > 0 && !(@index < 0 && !@cycle)
      end

      # Return line at the specified index
      #
      # @raise [IndexError] index out of range
      #
      # @api public
      def [](index)
        if index < 0
          index += @history.size if index < 0
        end
        line = @history[index]
        if line.nil?
          raise IndexError, 'invalid index'
        end
        line.dup
      end

      # Get current line
      #
      # @api public
      def get
        return if size.zero?

        self[@index]
      end

      # Empty all history lines
      #
      # @api public
      def clear
        @history.clear
        @index = 0
      end
    end # History
  end # Reader
end # TTY