hamster 0.2.13 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.rdoc +6 -0
- data/lib/hamster/hash.rb +9 -18
- data/lib/hamster/immutable.rb +52 -0
- data/lib/hamster/list.rb +10 -21
- data/lib/hamster/set.rb +12 -18
- data/lib/hamster/sorter.rb +4 -0
- data/lib/hamster/stack.rb +8 -10
- data/lib/hamster/tuple.rb +4 -5
- data/lib/hamster/version.rb +1 -1
- data/spec/hamster/hash/immutable_spec.rb +12 -0
- data/spec/hamster/immutable/copying_spec.rb +28 -0
- data/spec/hamster/immutable/immutable_spec.rb +58 -0
- data/spec/hamster/immutable/new_spec.rb +28 -0
- data/spec/hamster/immutable/transform_spec.rb +31 -0
- data/spec/hamster/immutable/transform_unless_spec.rb +55 -0
- data/spec/hamster/set/immutable_spec.rb +12 -0
- data/spec/hamster/sorter/immutable_spec.rb +12 -0
- data/spec/hamster/stack/immutable_spec.rb +12 -0
- data/spec/hamster/tuple/immutable_spec.rb +12 -0
- metadata +15 -4
data/History.rdoc
CHANGED
data/lib/hamster/hash.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'forwardable'
|
2
2
|
|
3
|
+
require 'hamster/immutable'
|
3
4
|
require 'hamster/trie'
|
4
5
|
|
5
6
|
module Hamster
|
@@ -12,8 +13,10 @@ module Hamster
|
|
12
13
|
|
13
14
|
extend Forwardable
|
14
15
|
|
15
|
-
|
16
|
-
|
16
|
+
include Immutable
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
@trie = EmptyTrie
|
17
20
|
end
|
18
21
|
|
19
22
|
def size
|
@@ -40,16 +43,12 @@ module Hamster
|
|
40
43
|
def_delegator :self, :get, :[]
|
41
44
|
|
42
45
|
def put(key, value)
|
43
|
-
|
46
|
+
transform { @trie = @trie.put(key, value) }
|
44
47
|
end
|
45
48
|
|
46
49
|
def delete(key)
|
47
50
|
trie = @trie.delete(key)
|
48
|
-
|
49
|
-
self
|
50
|
-
else
|
51
|
-
self.class.new(trie)
|
52
|
-
end
|
51
|
+
transform_unless(trie.equal?(@trie)) { @trie = trie }
|
53
52
|
end
|
54
53
|
|
55
54
|
def each
|
@@ -61,7 +60,7 @@ module Hamster
|
|
61
60
|
def map
|
62
61
|
return self unless block_given?
|
63
62
|
return self if empty?
|
64
|
-
|
63
|
+
transform { @trie = @trie.reduce(EmptyTrie) { |trie, entry| trie.put(*yield(entry.key, entry.value)) } }
|
65
64
|
end
|
66
65
|
def_delegator :self, :map, :collect
|
67
66
|
|
@@ -76,11 +75,7 @@ module Hamster
|
|
76
75
|
def filter
|
77
76
|
return self unless block_given?
|
78
77
|
trie = @trie.filter { |entry| yield(entry.key, entry.value) }
|
79
|
-
|
80
|
-
self
|
81
|
-
else
|
82
|
-
self.class.new(trie)
|
83
|
-
end
|
78
|
+
transform_unless(trie.equal?(@trie)) { @trie = trie }
|
84
79
|
end
|
85
80
|
def_delegator :self, :filter, :select
|
86
81
|
def_delegator :self, :filter, :find_all
|
@@ -132,10 +127,6 @@ module Hamster
|
|
132
127
|
reduce(0) { |h, key, value| h ^ key.hash }
|
133
128
|
end
|
134
129
|
|
135
|
-
def dup
|
136
|
-
self
|
137
|
-
end
|
138
|
-
def_delegator :self, :dup, :clone
|
139
130
|
def_delegator :self, :dup, :uniq
|
140
131
|
def_delegator :self, :dup, :nub
|
141
132
|
def_delegator :self, :dup, :remove_duplicates
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
module Hamster
|
4
|
+
|
5
|
+
module Immutable
|
6
|
+
|
7
|
+
def self.included(klass)
|
8
|
+
klass.extend(ClassMethods)
|
9
|
+
klass.instance_eval do
|
10
|
+
include InstanceMethods
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
module ClassMethods
|
15
|
+
|
16
|
+
def new(*args)
|
17
|
+
super.freeze
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
module InstanceMethods
|
23
|
+
|
24
|
+
extend Forwardable
|
25
|
+
|
26
|
+
def immutable?
|
27
|
+
frozen?
|
28
|
+
end
|
29
|
+
|
30
|
+
alias_method :__copy__, :dup
|
31
|
+
private :__copy__
|
32
|
+
|
33
|
+
def dup
|
34
|
+
self
|
35
|
+
end
|
36
|
+
def_delegator :self, :dup, :clone
|
37
|
+
|
38
|
+
protected
|
39
|
+
|
40
|
+
def transform_unless(condition, &block)
|
41
|
+
condition ? self : transform(&block)
|
42
|
+
end
|
43
|
+
|
44
|
+
def transform(&block)
|
45
|
+
__copy__.tap { |copy| copy.instance_eval(&block) }.freeze
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
data/lib/hamster/list.rb
CHANGED
@@ -534,29 +534,8 @@ module Hamster
|
|
534
534
|
def_delegator :target, :tail
|
535
535
|
def_delegator :target, :empty?
|
536
536
|
|
537
|
-
def head
|
538
|
-
target.head
|
539
|
-
end
|
540
|
-
|
541
|
-
def tail
|
542
|
-
target.tail
|
543
|
-
end
|
544
|
-
|
545
|
-
def empty?
|
546
|
-
target.empty?
|
547
|
-
end
|
548
|
-
|
549
537
|
protected
|
550
538
|
|
551
|
-
def target
|
552
|
-
# vivify
|
553
|
-
list = vivify
|
554
|
-
while list.is_a?(Stream)
|
555
|
-
list = list.vivify
|
556
|
-
end
|
557
|
-
list
|
558
|
-
end
|
559
|
-
|
560
539
|
def vivify
|
561
540
|
@lock.synchronize do
|
562
541
|
unless @block.nil?
|
@@ -567,6 +546,16 @@ module Hamster
|
|
567
546
|
@target
|
568
547
|
end
|
569
548
|
|
549
|
+
private
|
550
|
+
|
551
|
+
def target
|
552
|
+
list = vivify
|
553
|
+
while list.is_a?(Stream)
|
554
|
+
list = list.vivify
|
555
|
+
end
|
556
|
+
list
|
557
|
+
end
|
558
|
+
|
570
559
|
end
|
571
560
|
|
572
561
|
module EmptyList
|
data/lib/hamster/set.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'forwardable'
|
2
2
|
|
3
|
+
require 'hamster/immutable'
|
3
4
|
require 'hamster/undefined'
|
4
5
|
require 'hamster/tuple'
|
5
6
|
require 'hamster/sorter'
|
@@ -16,8 +17,10 @@ module Hamster
|
|
16
17
|
|
17
18
|
extend Forwardable
|
18
19
|
|
19
|
-
|
20
|
-
|
20
|
+
include Immutable
|
21
|
+
|
22
|
+
def initialize
|
23
|
+
@trie = EmptyTrie
|
21
24
|
end
|
22
25
|
|
23
26
|
def empty?
|
@@ -38,15 +41,13 @@ module Hamster
|
|
38
41
|
def_delegator :self, :include?, :elem?
|
39
42
|
|
40
43
|
def add(item)
|
41
|
-
|
42
|
-
self.class.new(@trie.put(item, nil))
|
44
|
+
transform_unless(include?(item)) { @trie = @trie.put(item, nil) }
|
43
45
|
end
|
44
46
|
def_delegator :self, :add, :<<
|
45
47
|
|
46
48
|
def delete(item)
|
47
49
|
trie = @trie.delete(item)
|
48
|
-
|
49
|
-
self.class.new(trie)
|
50
|
+
transform_unless(trie.equal?(@trie)) { @trie = trie }
|
50
51
|
end
|
51
52
|
|
52
53
|
def each
|
@@ -58,7 +59,7 @@ module Hamster
|
|
58
59
|
def map
|
59
60
|
return self unless block_given?
|
60
61
|
return self if empty?
|
61
|
-
|
62
|
+
transform { @trie = @trie.reduce(EmptyTrie) { |trie, entry| trie.put(yield(entry.key), nil) } }
|
62
63
|
end
|
63
64
|
def_delegator :self, :map, :collect
|
64
65
|
|
@@ -78,7 +79,7 @@ module Hamster
|
|
78
79
|
trie = @trie.filter { |entry| yield(entry.key) }
|
79
80
|
return self if trie.equal?(@trie)
|
80
81
|
return EmptySet if trie.empty?
|
81
|
-
|
82
|
+
transform { @trie = trie }
|
82
83
|
end
|
83
84
|
def_delegator :self, :filter, :select
|
84
85
|
def_delegator :self, :filter, :find_all
|
@@ -186,24 +187,21 @@ module Hamster
|
|
186
187
|
next trie if trie.has_key?(item)
|
187
188
|
trie.put(item, nil)
|
188
189
|
end
|
189
|
-
|
190
|
-
self.class.new(trie)
|
190
|
+
transform_unless(trie.equal?(@trie)) { @trie = trie }
|
191
191
|
end
|
192
192
|
def_delegator :self, :union, :|
|
193
193
|
def_delegator :self, :union, :+
|
194
194
|
|
195
195
|
def intersection(other)
|
196
196
|
trie = @trie.filter { |entry| other.include?(entry.key) }
|
197
|
-
|
198
|
-
self.class.new(trie)
|
197
|
+
transform_unless(trie.equal?(@trie)) { @trie = trie }
|
199
198
|
end
|
200
199
|
def_delegator :self, :intersection, :intersect
|
201
200
|
def_delegator :self, :intersection, :&
|
202
201
|
|
203
202
|
def difference(other)
|
204
203
|
trie = @trie.filter { |entry| !other.include?(entry.key) }
|
205
|
-
|
206
|
-
self.class.new(trie)
|
204
|
+
transform_unless(trie.equal?(@trie)) { @trie = trie }
|
207
205
|
end
|
208
206
|
def_delegator :self, :difference, :diff
|
209
207
|
def_delegator :self, :difference, :subtract
|
@@ -254,10 +252,6 @@ module Hamster
|
|
254
252
|
reduce(0) { |h, item| h ^ item.hash }
|
255
253
|
end
|
256
254
|
|
257
|
-
def dup
|
258
|
-
self
|
259
|
-
end
|
260
|
-
def_delegator :self, :dup, :clone
|
261
255
|
def_delegator :self, :dup, :uniq
|
262
256
|
def_delegator :self, :dup, :nub
|
263
257
|
def_delegator :self, :dup, :to_set
|
data/lib/hamster/sorter.rb
CHANGED
data/lib/hamster/stack.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'forwardable'
|
2
2
|
|
3
|
+
require 'hamster/immutable'
|
3
4
|
require 'hamster/list'
|
4
5
|
|
5
6
|
module Hamster
|
@@ -12,8 +13,10 @@ module Hamster
|
|
12
13
|
|
13
14
|
extend Forwardable
|
14
15
|
|
15
|
-
|
16
|
-
|
16
|
+
include Immutable
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
@list = EmptyList
|
17
20
|
end
|
18
21
|
|
19
22
|
def empty?
|
@@ -30,7 +33,7 @@ module Hamster
|
|
30
33
|
end
|
31
34
|
|
32
35
|
def push(item)
|
33
|
-
|
36
|
+
transform { @list = @list.cons(item) }
|
34
37
|
end
|
35
38
|
def_delegator :self, :push, :<<
|
36
39
|
|
@@ -39,7 +42,7 @@ module Hamster
|
|
39
42
|
if list.empty?
|
40
43
|
EmptyStack
|
41
44
|
else
|
42
|
-
|
45
|
+
transform { @list = list }
|
43
46
|
end
|
44
47
|
end
|
45
48
|
|
@@ -54,11 +57,6 @@ module Hamster
|
|
54
57
|
end
|
55
58
|
def_delegator :self, :eql?, :==
|
56
59
|
|
57
|
-
def dup
|
58
|
-
self
|
59
|
-
end
|
60
|
-
def_delegator :self, :dup, :clone
|
61
|
-
|
62
60
|
def to_a
|
63
61
|
@list.to_a
|
64
62
|
end
|
@@ -78,6 +76,6 @@ module Hamster
|
|
78
76
|
|
79
77
|
end
|
80
78
|
|
81
|
-
EmptyStack = Stack.new
|
79
|
+
EmptyStack = Stack.new
|
82
80
|
|
83
81
|
end
|
data/lib/hamster/tuple.rb
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
require 'forwardable'
|
2
2
|
|
3
|
+
require 'hamster/immutable'
|
4
|
+
|
3
5
|
module Hamster
|
4
6
|
|
5
7
|
class Tuple
|
6
8
|
|
7
9
|
extend Forwardable
|
8
10
|
|
11
|
+
include Immutable
|
12
|
+
|
9
13
|
def initialize(*items)
|
10
14
|
@items = items.freeze
|
11
15
|
end
|
@@ -25,11 +29,6 @@ module Hamster
|
|
25
29
|
end
|
26
30
|
def_delegator :self, :eql?, :==
|
27
31
|
|
28
|
-
def dup
|
29
|
-
self
|
30
|
-
end
|
31
|
-
def_delegator :self, :dup, :clone
|
32
|
-
|
33
32
|
def to_ary
|
34
33
|
@items
|
35
34
|
end
|
data/lib/hamster/version.rb
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
require 'hamster/immutable'
|
4
|
+
|
5
|
+
describe Hamster::Immutable do
|
6
|
+
|
7
|
+
class Fixture
|
8
|
+
include Hamster::Immutable
|
9
|
+
end
|
10
|
+
|
11
|
+
[:dup, :clone].each do |method|
|
12
|
+
|
13
|
+
describe "##{method}" do
|
14
|
+
|
15
|
+
before do
|
16
|
+
@original = Fixture.new
|
17
|
+
@result = @original.send(method)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "returns self" do
|
21
|
+
@result.should equal(@original)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
require 'hamster/immutable'
|
4
|
+
|
5
|
+
describe Hamster::Immutable do
|
6
|
+
|
7
|
+
describe "#immutable?" do
|
8
|
+
|
9
|
+
describe "object constructed after its class becomes Immutable" do
|
10
|
+
|
11
|
+
class Fixture
|
12
|
+
include Hamster::Immutable
|
13
|
+
end
|
14
|
+
|
15
|
+
before do
|
16
|
+
@fixture = Fixture.new
|
17
|
+
end
|
18
|
+
|
19
|
+
it "returns true" do
|
20
|
+
@fixture.should be_immutable
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "object constructed before its class becomes Immutable" do
|
26
|
+
|
27
|
+
before do
|
28
|
+
@fixture = Class.new.new
|
29
|
+
@fixture.class.instance_eval do
|
30
|
+
include Hamster::Immutable
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "that are not frozen" do
|
35
|
+
|
36
|
+
it "returns false" do
|
37
|
+
@fixture.should_not be_immutable
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "that are frozen" do
|
43
|
+
|
44
|
+
before do
|
45
|
+
@fixture.freeze
|
46
|
+
end
|
47
|
+
|
48
|
+
it "returns true" do
|
49
|
+
@fixture.should be_immutable
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
require 'hamster/immutable'
|
4
|
+
|
5
|
+
describe Hamster::Immutable do
|
6
|
+
|
7
|
+
describe "#new" do
|
8
|
+
|
9
|
+
class Person < Struct.new(:first, :last)
|
10
|
+
include Hamster::Immutable
|
11
|
+
end
|
12
|
+
|
13
|
+
before do
|
14
|
+
@instance = Person.new("Simon", "Harris")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "passes the constructor arguments" do
|
18
|
+
@instance.first.should == "Simon"
|
19
|
+
@instance.last.should == "Harris"
|
20
|
+
end
|
21
|
+
|
22
|
+
it "freezes the instance" do
|
23
|
+
@instance.should be_frozen
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
require 'hamster/immutable'
|
4
|
+
|
5
|
+
describe Hamster::Immutable do
|
6
|
+
|
7
|
+
describe "#transform" do
|
8
|
+
|
9
|
+
class Person < Struct.new(:first, :last)
|
10
|
+
include Hamster::Immutable
|
11
|
+
public :transform
|
12
|
+
end
|
13
|
+
|
14
|
+
before do
|
15
|
+
@original = Person.new("Simon", "Harris")
|
16
|
+
@result = @original.transform { self.first = "Sampy" }
|
17
|
+
end
|
18
|
+
|
19
|
+
it "preserves the original" do
|
20
|
+
@original.first.should == "Simon"
|
21
|
+
@original.last.should == "Harris"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "returns a new instance with the updated values" do
|
25
|
+
@result.first.should == "Sampy"
|
26
|
+
@result.last.should == "Harris"
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
require 'hamster/immutable'
|
4
|
+
|
5
|
+
describe Hamster::Immutable do
|
6
|
+
|
7
|
+
describe "#transform_unless" do
|
8
|
+
|
9
|
+
class Person < Struct.new(:first, :last)
|
10
|
+
include Hamster::Immutable
|
11
|
+
public :transform_unless
|
12
|
+
end
|
13
|
+
|
14
|
+
before do
|
15
|
+
@original = Person.new("Simon", "Harris")
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "when the condition is false" do
|
19
|
+
|
20
|
+
before do
|
21
|
+
@result = @original.transform_unless(false) { self.first = "Sampy" }
|
22
|
+
end
|
23
|
+
|
24
|
+
it "preserves the original" do
|
25
|
+
@original.first.should == "Simon"
|
26
|
+
@original.last.should == "Harris"
|
27
|
+
end
|
28
|
+
|
29
|
+
it "returns a new instance with the updated values" do
|
30
|
+
@result.first.should == "Sampy"
|
31
|
+
@result.last.should == "Harris"
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "when the condition is true" do
|
37
|
+
|
38
|
+
before do
|
39
|
+
@result = @original.transform_unless(true) { fail("Should never be called") }
|
40
|
+
end
|
41
|
+
|
42
|
+
it "preserves the original" do
|
43
|
+
@original.first.should == "Simon"
|
44
|
+
@original.last.should == "Harris"
|
45
|
+
end
|
46
|
+
|
47
|
+
it "returns the original" do
|
48
|
+
@result.should equal(@original)
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 3
|
8
|
+
- 0
|
9
|
+
version: 0.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Simon Harris
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-03-
|
17
|
+
date: 2010-03-28 00:00:00 +11:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -60,6 +60,7 @@ files:
|
|
60
60
|
- lib/hamster/core_ext/io.rb
|
61
61
|
- lib/hamster/core_ext.rb
|
62
62
|
- lib/hamster/hash.rb
|
63
|
+
- lib/hamster/immutable.rb
|
63
64
|
- lib/hamster/list.rb
|
64
65
|
- lib/hamster/set.rb
|
65
66
|
- lib/hamster/sorter.rb
|
@@ -86,6 +87,7 @@ files:
|
|
86
87
|
- spec/hamster/hash/get_spec.rb
|
87
88
|
- spec/hamster/hash/has_key_spec.rb
|
88
89
|
- spec/hamster/hash/hash_spec.rb
|
90
|
+
- spec/hamster/hash/immutable_spec.rb
|
89
91
|
- spec/hamster/hash/inspect_spec.rb
|
90
92
|
- spec/hamster/hash/keys_spec.rb
|
91
93
|
- spec/hamster/hash/map_spec.rb
|
@@ -95,6 +97,11 @@ files:
|
|
95
97
|
- spec/hamster/hash/remove_spec.rb
|
96
98
|
- spec/hamster/hash/size_spec.rb
|
97
99
|
- spec/hamster/hash/uniq_spec.rb
|
100
|
+
- spec/hamster/immutable/copying_spec.rb
|
101
|
+
- spec/hamster/immutable/immutable_spec.rb
|
102
|
+
- spec/hamster/immutable/new_spec.rb
|
103
|
+
- spec/hamster/immutable/transform_spec.rb
|
104
|
+
- spec/hamster/immutable/transform_unless_spec.rb
|
98
105
|
- spec/hamster/list/all_spec.rb
|
99
106
|
- spec/hamster/list/any_spec.rb
|
100
107
|
- spec/hamster/list/append_spec.rb
|
@@ -182,6 +189,7 @@ files:
|
|
182
189
|
- spec/hamster/set/group_by_spec.rb
|
183
190
|
- spec/hamster/set/hash_spec.rb
|
184
191
|
- spec/hamster/set/head_spec.rb
|
192
|
+
- spec/hamster/set/immutable_spec.rb
|
185
193
|
- spec/hamster/set/include_spec.rb
|
186
194
|
- spec/hamster/set/inspect_spec.rb
|
187
195
|
- spec/hamster/set/intersection_spec.rb
|
@@ -205,11 +213,13 @@ files:
|
|
205
213
|
- spec/hamster/set/to_set_spec.rb
|
206
214
|
- spec/hamster/set/union_spec.rb
|
207
215
|
- spec/hamster/set/uniq_spec.rb
|
216
|
+
- spec/hamster/sorter/immutable_spec.rb
|
208
217
|
- spec/hamster/stack/clear_spec.rb
|
209
218
|
- spec/hamster/stack/construction_spec.rb
|
210
219
|
- spec/hamster/stack/copying_spec.rb
|
211
220
|
- spec/hamster/stack/empty_spec.rb
|
212
221
|
- spec/hamster/stack/eql_spec.rb
|
222
|
+
- spec/hamster/stack/immutable_spec.rb
|
213
223
|
- spec/hamster/stack/inspect_spec.rb
|
214
224
|
- spec/hamster/stack/pop_spec.rb
|
215
225
|
- spec/hamster/stack/push_spec.rb
|
@@ -222,6 +232,7 @@ files:
|
|
222
232
|
- spec/hamster/tuple/copying_spec.rb
|
223
233
|
- spec/hamster/tuple/eql_spec.rb
|
224
234
|
- spec/hamster/tuple/first_spec.rb
|
235
|
+
- spec/hamster/tuple/immutable_spec.rb
|
225
236
|
- spec/hamster/tuple/inspect_spec.rb
|
226
237
|
- spec/hamster/tuple/last_spec.rb
|
227
238
|
- spec/hamster/tuple/to_a_spec.rb
|