Class: Immutable::Queue
- Inherits:
-
Object
- Object
- Immutable::Queue
- Includes:
- Enumerable
- Defined in:
- lib/immutable/queue.rb
Overview
Immutable::Queue is an implementation of real-time queues described in “Purely Functional Data Structures” by Chris Okasaki.
Class Method Summary collapse
-
.[](*elements) ⇒ List
Creates a new queue populated with the given objects.
-
.empty ⇒ Queue
Returns an empty queue.
Instance Method Summary collapse
-
#each(&block) ⇒ Object
Calls
blockonce for each element inself. -
#empty? ⇒ true, false
Returns whether
selfis empty. -
#head ⇒ Object
Returns the first element of
self. -
#initialize(front, rear, schedule) ⇒ Queue
constructor
Queue.newis for internal use only. -
#snoc(x) ⇒ Queue
(also: #push)
Adds a new element at the end of
self. -
#tail ⇒ Queue
Returns the elements after the head of
self.
Constructor Details
Class Method Details
.[](*elements) ⇒ List
Creates a new queue populated with the given objects.
28 29 30 |
# File 'lib/immutable/queue.rb', line 28 def self.[](*elements) elements.inject(empty, &:snoc) end |
Instance Method Details
#each(&block) ⇒ Object
Calls block once for each element in self.
93 94 95 96 97 98 |
# File 'lib/immutable/queue.rb', line 93 def each(&block) unless @front.null? yield(head) tail.each(&block) end end |
#empty? ⇒ true, false
Returns whether self is empty.
35 36 37 |
# File 'lib/immutable/queue.rb', line 35 def empty? @front.null? end |
#head ⇒ Object
Returns the first element of self. If self is empty, Immutable::List::EmptyError is raised.
76 77 78 |
# File 'lib/immutable/queue.rb', line 76 def head @front.head end |
#snoc(x) ⇒ Queue Also known as: push
Adds a new element at the end of self.
67 68 69 |
# File 'lib/immutable/queue.rb', line 67 def snoc(x) queue(@front, Cons[x, @rear], @schedule) end |
#tail ⇒ Queue
Returns the elements after the head of self. If self is empty, Immutable::List::EmptyError is raised.
84 85 86 87 88 89 90 |
# File 'lib/immutable/queue.rb', line 84 def tail if @front.null? raise List::EmptyError else queue(@front.tail, @rear, @schedule) end end |