Sha256: 4db2a1029364fe018efe20f00c961a044512a748773b41a24bf13c8f8a26ae4d

Contents?: true

Size: 1.59 KB

Versions: 1

Compression:

Stored size: 1.59 KB

Contents

require "forwardable"
require "hamster/immutable"
require "hamster/list"

module Hamster
  def self.queue(*items)
    items.reduce(EmptyQueue) { |queue, item| queue.enqueue(item) }
  end

  class Queue
    extend Forwardable
    include Immutable

    def initialize
      @front = @rear = EmptyList
    end

    def empty?
      @front.empty? && @rear.empty?
    end
    def_delegator :self, :empty?, :null?

    def size
      @front.size + @rear.size
    end
    def_delegator :self, :size, :length

    def head
      return @front.head unless @front.empty?
      @rear.last
    end
    def_delegator :self, :head, :first
    def_delegator :self, :head, :peek
    def_delegator :self, :head, :front

    def enqueue(item)
      transform { @rear = @rear.cons(item) }
    end
    def_delegator :self, :enqueue, :<<
    def_delegator :self, :enqueue, :add

    def dequeue
      front = @front
      rear = @rear
      if front.empty?
        return EmptyQueue if rear.empty?
        front = rear.reverse
        rear = EmptyList
      end

      transform do
        @front = front.tail
        @rear = rear
      end
    end
    def_delegator :self, :dequeue, :tail

    def clear
      EmptyQueue
    end

    def eql?(other)
      instance_of?(other.class) &&
        to_list.eql?(other.to_list)
    end
    def_delegator :self, :eql?, :==

    def to_a
      to_list.to_a
    end
    def_delegator :self, :to_a, :entries

    def to_ary
      to_list.to_ary
    end

    def to_list
      @front.append(@rear.reverse)
    end

    def inspect
      to_list.inspect
    end
  end

  EmptyQueue = Hamster::Queue.new
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
hamster-1.0.1.pre.rc.1 lib/hamster/queue.rb