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
block
once for each element inself
. -
#empty? ⇒ true, false
Returns whether
self
is empty. -
#head ⇒ Object
Returns the first element of
self
. -
#initialize(front, rear, schedule) ⇒ Queue
constructor
Queue.new
is 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 |