hamster 0.1.2 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. data/History.rdoc +13 -1
  2. data/README.rdoc +72 -25
  3. data/TODO +1 -0
  4. data/lib/hamster.rb +4 -1
  5. data/lib/hamster/hash.rb +66 -0
  6. data/lib/hamster/list.rb +105 -0
  7. data/lib/hamster/set.rb +65 -0
  8. data/lib/hamster/stack.rb +53 -0
  9. data/lib/hamster/trie.rb +45 -28
  10. data/lib/hamster/version.rb +1 -1
  11. data/spec/hamster/hash/copying_spec.rb +25 -0
  12. data/spec/hamster/hash/each_spec.rb +47 -0
  13. data/spec/hamster/hash/empty_spec.rb +17 -0
  14. data/spec/hamster/hash/eql_spec.rb +20 -0
  15. data/spec/hamster/hash/get_spec.rb +22 -0
  16. data/spec/hamster/hash/has_key_spec.rb +21 -0
  17. data/spec/hamster/hash/put_spec.rb +93 -0
  18. data/spec/hamster/hash/remove_spec.rb +113 -0
  19. data/spec/hamster/list/accessor_spec.rb +26 -0
  20. data/spec/hamster/list/car_spec.rb +17 -0
  21. data/spec/hamster/list/copying_spec.rb +25 -0
  22. data/spec/hamster/list/each_spec.rb +45 -0
  23. data/spec/hamster/list/empty_spec.rb +18 -0
  24. data/spec/hamster/list/eql_spec.rb +22 -0
  25. data/spec/hamster/list/map_spec.rb +43 -0
  26. data/spec/hamster/list/reduce_spec.rb +31 -0
  27. data/spec/hamster/stack/copying_spec.rb +25 -0
  28. data/spec/hamster/stack/empty_spec.rb +17 -0
  29. data/spec/hamster/stack/eql_spec.rb +20 -0
  30. data/spec/hamster/stack/push_spec.rb +42 -0
  31. metadata +28 -12
  32. data/lib/hamster/entry.rb +0 -18
  33. data/spec/hamster/trie/each_spec.rb +0 -51
  34. data/spec/hamster/trie/empty_spec.rb +0 -22
  35. data/spec/hamster/trie/enumerable_spec.rb +0 -13
  36. data/spec/hamster/trie/get_spec.rb +0 -26
  37. data/spec/hamster/trie/has_key_spec.rb +0 -25
  38. data/spec/hamster/trie/put_spec.rb +0 -97
  39. data/spec/hamster/trie/remove_spec.rb +0 -115
@@ -0,0 +1,45 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::List do
4
+
5
+ describe "#each" do
6
+
7
+ before do
8
+ @expected_values = (0..100).to_a
9
+ @list = Hamster::List.new
10
+ @expected_values.reverse.each { |value| @list = @list.cons(value) }
11
+ end
12
+
13
+ describe "with a block (internal iteration)" do
14
+
15
+ it "returns self" do
16
+ @list.each {}.should equal(@list)
17
+ end
18
+
19
+ it "yields all key value pairs" do
20
+ actual_values = []
21
+ @list.each do |value|
22
+ actual_values << value
23
+ end
24
+ actual_values.should == @expected_values
25
+ end
26
+
27
+ end
28
+
29
+ describe "with no block (external iteration)" do
30
+
31
+ it "returns an enumerator over all key value pairs" do
32
+ actual_values = []
33
+ enum = @list.each
34
+ loop do
35
+ value = enum.next
36
+ actual_values << value
37
+ end
38
+ actual_values.should == @expected_values
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+
45
+ end
@@ -0,0 +1,18 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::List do
4
+
5
+ describe "#empty?" do
6
+
7
+ it "initially returns true" do
8
+ Hamster::List.new.should be_empty
9
+ end
10
+
11
+ it "returns false once items have been added" do
12
+ list = Hamster::List.new.cons("A")
13
+ list.should_not be_empty
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -0,0 +1,22 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::List do
4
+
5
+ describe "#eql?" do
6
+
7
+ it "is true for the same instance" do
8
+ list = Hamster::List.new
9
+ pending do
10
+ list.should eql(list)
11
+ end
12
+ end
13
+
14
+ it "is true for two empty instances" do
15
+ pending do
16
+ Hamster::List.new.should eql(Hamster::List.new)
17
+ end
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,43 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::List do
4
+
5
+ describe "#map" do
6
+
7
+ it "initially returns self" do
8
+ list = Hamster::List.new
9
+ list.map {}.should equal(list)
10
+ end
11
+
12
+ describe "when not empty" do
13
+
14
+ before do
15
+ @original = Hamster::List.new.cons(1).cons(2).cons(3).cons(4)
16
+ @copy = @original.map { |i| i + 5 }
17
+ end
18
+
19
+ it "returns a modified copy" do
20
+ @copy.should_not equal(@original)
21
+ end
22
+
23
+ describe "the original" do
24
+
25
+ it "has the original values" do
26
+ @original.to_enum.to_a.should == [4, 3, 2, 1]
27
+ end
28
+
29
+ end
30
+
31
+ describe "the modified copy" do
32
+
33
+ it "has the mapped values" do
34
+ @copy.to_enum.to_a.should == [9, 8, 7, 6]
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -0,0 +1,31 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::List do
4
+
5
+ describe "#reduce" do
6
+
7
+ it "initially returns memo" do
8
+ Hamster::List.new.reduce(0).should == 0
9
+ end
10
+
11
+ describe "with values" do
12
+
13
+ before do
14
+ @list = Hamster::List.new.cons(1).cons(2).cons(3).cons(4)
15
+ end
16
+
17
+ it "works with an initial value" do
18
+ @list.reduce(0) { |memo, i| memo + i }.should == 10
19
+ end
20
+
21
+ it "defaults to the first item in the list" do
22
+ pending do
23
+ @list.reduce { |memo, i| memo + i }.should == 10
24
+ end
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -0,0 +1,25 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::Stack do
4
+
5
+ before do
6
+ @stack = Hamster::Stack.new
7
+ end
8
+
9
+ describe "#dup" do
10
+
11
+ it "returns self" do
12
+ @stack.dup.should equal(@stack)
13
+ end
14
+
15
+ end
16
+
17
+ describe "#clone" do
18
+
19
+ it "returns self" do
20
+ @stack.clone.should equal(@stack)
21
+ end
22
+
23
+ end
24
+
25
+ end
@@ -0,0 +1,17 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::Stack do
4
+
5
+ describe "#empty?" do
6
+
7
+ it "initially returns true" do
8
+ Hamster::Stack.new.should be_empty
9
+ end
10
+
11
+ it "returns false once items have been added" do
12
+ Hamster::Stack.new.push("A").should_not be_empty
13
+ end
14
+
15
+ end
16
+
17
+ end
@@ -0,0 +1,20 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::Stack do
4
+
5
+ describe "#eql?" do
6
+
7
+ it "is true for the same instance" do
8
+ stack = Hamster::Stack.new
9
+ stack.should eql(stack)
10
+ end
11
+
12
+ it "is true for two empty instances" do
13
+ pending do
14
+ Hamster::Stack.new.should eql(Hamster::Stack.new)
15
+ end
16
+ end
17
+
18
+ end
19
+
20
+ end
@@ -0,0 +1,42 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::Stack do
4
+
5
+ describe "#push" do
6
+
7
+ before do
8
+ @original = Hamster::Stack.new.push("A")
9
+ @copy = @original.push("B")
10
+ end
11
+
12
+ it "returns a modified copy" do
13
+ @copy.should_not equal(@original)
14
+ end
15
+
16
+ describe "the original" do
17
+
18
+ it "still has the original top" do
19
+ @original.top.should == "A"
20
+ end
21
+
22
+ it "still has the original size" do
23
+ @original.size.should == 1
24
+ end
25
+
26
+ end
27
+
28
+ describe "the modified copy" do
29
+
30
+ it "has a new top" do
31
+ @copy.top.should == "B"
32
+ end
33
+
34
+ it "size is increased by one" do
35
+ @copy.size == 2
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+
42
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hamster
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simon Harris
@@ -9,11 +9,11 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-25 00:00:00 +11:00
12
+ date: 2009-11-07 00:00:00 +11:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
16
- description: Hash Array Mapped Tries (HAMT) for Ruby
16
+ description: Persistent Data Structures for Ruby
17
17
  email: haruki.zaemon@gmail.com
18
18
  executables: []
19
19
 
@@ -25,17 +25,33 @@ extra_rdoc_files:
25
25
  - TODO
26
26
  - LICENSE
27
27
  files:
28
- - lib/hamster/entry.rb
28
+ - lib/hamster/hash.rb
29
+ - lib/hamster/list.rb
30
+ - lib/hamster/set.rb
31
+ - lib/hamster/stack.rb
29
32
  - lib/hamster/trie.rb
30
33
  - lib/hamster/version.rb
31
34
  - lib/hamster.rb
32
- - spec/hamster/trie/each_spec.rb
33
- - spec/hamster/trie/empty_spec.rb
34
- - spec/hamster/trie/enumerable_spec.rb
35
- - spec/hamster/trie/get_spec.rb
36
- - spec/hamster/trie/has_key_spec.rb
37
- - spec/hamster/trie/put_spec.rb
38
- - spec/hamster/trie/remove_spec.rb
35
+ - spec/hamster/hash/copying_spec.rb
36
+ - spec/hamster/hash/each_spec.rb
37
+ - spec/hamster/hash/empty_spec.rb
38
+ - spec/hamster/hash/eql_spec.rb
39
+ - spec/hamster/hash/get_spec.rb
40
+ - spec/hamster/hash/has_key_spec.rb
41
+ - spec/hamster/hash/put_spec.rb
42
+ - spec/hamster/hash/remove_spec.rb
43
+ - spec/hamster/list/accessor_spec.rb
44
+ - spec/hamster/list/car_spec.rb
45
+ - spec/hamster/list/copying_spec.rb
46
+ - spec/hamster/list/each_spec.rb
47
+ - spec/hamster/list/empty_spec.rb
48
+ - spec/hamster/list/eql_spec.rb
49
+ - spec/hamster/list/map_spec.rb
50
+ - spec/hamster/list/reduce_spec.rb
51
+ - spec/hamster/stack/copying_spec.rb
52
+ - spec/hamster/stack/empty_spec.rb
53
+ - spec/hamster/stack/eql_spec.rb
54
+ - spec/hamster/stack/push_spec.rb
39
55
  - spec/spec.opts
40
56
  - spec/spec_helper.rb
41
57
  - tasks/spec.rb
@@ -71,6 +87,6 @@ rubyforge_project:
71
87
  rubygems_version: 1.3.5
72
88
  signing_key:
73
89
  specification_version: 3
74
- summary: Hash Array Mapped Tries (HAMT) for Ruby
90
+ summary: Persistent Data Structures for Ruby
75
91
  test_files: []
76
92
 
data/lib/hamster/entry.rb DELETED
@@ -1,18 +0,0 @@
1
- module Hamster
2
-
3
- class Entry
4
-
5
- attr_reader :key, :value
6
-
7
- def initialize(key, value)
8
- @key = key
9
- @value = value
10
- end
11
-
12
- def has_key?(key)
13
- @key.eql?(key)
14
- end
15
-
16
- end
17
-
18
- end
@@ -1,51 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
-
3
- module Hamster
4
-
5
- describe Trie do
6
-
7
- describe "#each" do
8
-
9
- before do
10
- @trie = Trie.new
11
- @expected_pairs = { "A" => "aye", "B" => "bee", "C" => "sea" }
12
- @expected_pairs.each do |key, value|
13
- @trie = @trie.put(key, value)
14
- end
15
- end
16
-
17
- describe "with a block (internal iteration)" do
18
-
19
- it "returns self" do
20
- @trie.each {}.should == @trie
21
- end
22
-
23
- it "yields all key value pairs" do
24
- actual_pairs = {}
25
- @trie.each do |key, value|
26
- actual_pairs[key] = value
27
- end
28
- actual_pairs.should == @expected_pairs
29
- end
30
-
31
- end
32
-
33
- describe "with no block (external iteration)" do
34
-
35
- it "returns an enumerator over all key value pairs" do
36
- actual_pairs = {}
37
- enum = @trie.each
38
- loop do
39
- key, value = enum.next
40
- actual_pairs[key] = value
41
- end
42
- actual_pairs.should == @expected_pairs
43
- end
44
-
45
- end
46
-
47
- end
48
-
49
- end
50
-
51
- end
@@ -1,22 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
-
3
- module Hamster
4
-
5
- describe Trie do
6
-
7
- describe "#empty?" do
8
-
9
- it "initially returns true" do
10
- Trie.new.should be_empty
11
- end
12
-
13
- it "returns false once items have been added" do
14
- trie = Trie.new.put("A", "aye")
15
- trie.should_not be_empty
16
- end
17
-
18
- end
19
-
20
- end
21
-
22
- end