hamster 0.1.23 → 0.2.0

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 (65) hide show
  1. data/History.rdoc +26 -0
  2. data/README.rdoc +1 -1
  3. data/lib/hamster.rb +1 -1
  4. data/lib/hamster/core_ext/io.rb +7 -5
  5. data/lib/hamster/hash.rb +31 -29
  6. data/lib/hamster/list.rb +203 -128
  7. data/lib/hamster/set.rb +39 -25
  8. data/lib/hamster/stack.rb +9 -5
  9. data/lib/hamster/trie.rb +5 -1
  10. data/lib/hamster/version.rb +1 -1
  11. data/spec/hamster/hash/all_spec.rb +29 -25
  12. data/spec/hamster/hash/reduce_spec.rb +1 -1
  13. data/spec/hamster/hash/uniq_spec.rb +23 -0
  14. data/spec/hamster/list/all_spec.rb +55 -55
  15. data/spec/hamster/list/any_spec.rb +4 -8
  16. data/spec/hamster/list/append_spec.rb +2 -20
  17. data/spec/hamster/list/break_spec.rb +22 -121
  18. data/spec/hamster/list/cadr_spec.rb +4 -0
  19. data/spec/hamster/list/chunk_spec.rb +6 -0
  20. data/spec/hamster/list/combinations_spec.rb +51 -0
  21. data/spec/hamster/list/count_spec.rb +4 -8
  22. data/spec/hamster/list/cycle_spec.rb +5 -24
  23. data/spec/hamster/list/drop_spec.rb +2 -14
  24. data/spec/hamster/list/drop_while_spec.rb +2 -14
  25. data/spec/hamster/list/each_spec.rb +4 -8
  26. data/spec/hamster/list/eql_spec.rb +9 -10
  27. data/spec/hamster/list/filter_spec.rb +2 -20
  28. data/spec/hamster/list/find_spec.rb +4 -8
  29. data/spec/hamster/list/grep_spec.rb +2 -20
  30. data/spec/hamster/list/include_spec.rb +4 -8
  31. data/spec/hamster/list/init_spec.rb +4 -0
  32. data/spec/hamster/list/inits_spec.rb +42 -0
  33. data/spec/hamster/list/inspect_spec.rb +4 -8
  34. data/spec/hamster/list/intersperse_spec.rb +2 -14
  35. data/spec/hamster/list/join_spec.rb +4 -8
  36. data/spec/hamster/list/last_spec.rb +4 -8
  37. data/spec/hamster/list/map_spec.rb +2 -14
  38. data/spec/hamster/list/maximum_spec.rb +4 -8
  39. data/spec/hamster/list/minimum_spec.rb +4 -8
  40. data/spec/hamster/list/none_spec.rb +4 -8
  41. data/spec/hamster/list/one_spec.rb +4 -8
  42. data/spec/hamster/list/partition_spec.rb +12 -111
  43. data/spec/hamster/list/product_spec.rb +4 -8
  44. data/spec/hamster/list/reduce_spec.rb +4 -8
  45. data/spec/hamster/list/remove_spec.rb +2 -14
  46. data/spec/hamster/list/reverse_spec.rb +4 -8
  47. data/spec/hamster/list/size_spec.rb +4 -8
  48. data/spec/hamster/list/sorting_spec.rb +2 -14
  49. data/spec/hamster/list/span_spec.rb +22 -121
  50. data/spec/hamster/list/split_at_spec.rb +2 -65
  51. data/spec/hamster/list/sum_spec.rb +4 -8
  52. data/spec/hamster/list/tails_spec.rb +42 -0
  53. data/spec/hamster/list/take_spec.rb +2 -14
  54. data/spec/hamster/list/take_while_spec.rb +2 -14
  55. data/spec/hamster/list/to_a_spec.rb +4 -8
  56. data/spec/hamster/list/to_ary_spec.rb +4 -8
  57. data/spec/hamster/list/union_spec.rb +1 -21
  58. data/spec/hamster/list/uniq_spec.rb +3 -15
  59. data/spec/hamster/list/zip_spec.rb +1 -21
  60. data/spec/hamster/set/all_spec.rb +33 -29
  61. data/spec/hamster/set/product_spec.rb +32 -0
  62. data/spec/hamster/set/sum_spec.rb +32 -0
  63. data/spec/hamster/set/uniq_spec.rb +1 -1
  64. data/spec/spec.opts +0 -1
  65. metadata +8 -2
data/lib/hamster/set.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'forwardable'
2
+
1
3
  require 'hamster/trie'
2
4
  require 'hamster/list'
3
5
 
@@ -9,6 +11,8 @@ module Hamster
9
11
 
10
12
  class Set
11
13
 
14
+ extend Forwardable
15
+
12
16
  def initialize(trie = Trie.new)
13
17
  @trie = trie
14
18
  end
@@ -16,19 +20,19 @@ module Hamster
16
20
  def empty?
17
21
  @trie.empty?
18
22
  end
19
- alias_method :null?, :empty?
23
+ def_delegator :self, :empty?, :null?
20
24
 
21
25
  def size
22
26
  @trie.size
23
27
  end
24
- alias_method :length, :size
28
+ def_delegator :self, :size, :length
25
29
 
26
30
  def include?(item)
27
31
  @trie.has_key?(item)
28
32
  end
29
- alias_method :member?, :include?
30
- alias_method :contains?, :include?
31
- alias_method :elem?, :include?
33
+ def_delegator :self, :include?, :member?
34
+ def_delegator :self, :include?, :contains?
35
+ def_delegator :self, :include?, :elem?
32
36
 
33
37
  def add(item)
34
38
  if include?(item)
@@ -37,7 +41,7 @@ module Hamster
37
41
  self.class.new(@trie.put(item, nil))
38
42
  end
39
43
  end
40
- alias_method :<<, :add
44
+ def_delegator :self, :add, :<<
41
45
 
42
46
  def delete(key)
43
47
  trie = @trie.delete(key)
@@ -52,7 +56,7 @@ module Hamster
52
56
  return self unless block_given?
53
57
  @trie.each { |entry| yield(entry.key) }
54
58
  end
55
- alias_method :foreach, :each
59
+ def_delegator :self, :each, :foreach
56
60
 
57
61
  def map
58
62
  return self unless block_given?
@@ -62,14 +66,14 @@ module Hamster
62
66
  self.class.new(@trie.reduce(Trie.new) { |trie, entry| trie.put(yield(entry.key), nil) })
63
67
  end
64
68
  end
65
- alias_method :collect, :map
69
+ def_delegator :self, :map, :collect
66
70
 
67
71
  def reduce(memo)
68
72
  return memo unless block_given?
69
73
  @trie.reduce(memo) { |memo, entry| yield(memo, entry.key) }
70
74
  end
71
- alias_method :inject, :reduce
72
- alias_method :fold, :reduce
75
+ def_delegator :self, :reduce, :inject
76
+ def_delegator :self, :reduce, :fold
73
77
 
74
78
  def filter
75
79
  return self unless block_given?
@@ -80,29 +84,30 @@ module Hamster
80
84
  self.class.new(trie)
81
85
  end
82
86
  end
83
- alias_method :select, :filter
84
- alias_method :find_all, :filter
87
+ def_delegator :self, :filter, :select
88
+ def_delegator :self, :filter, :find_all
85
89
 
86
90
  def remove
87
91
  return self unless block_given?
88
92
  filter { |item| !yield(item) }
89
93
  end
90
- alias_method :reject, :remove
91
- alias_method :delete_if, :remove
94
+ def_delegator :self, :remove, :reject
95
+ def_delegator :self, :remove, :delete_if
92
96
 
93
97
  def any?
94
98
  return any? { |item| item } unless block_given?
95
99
  each { |item| return true if yield(item) }
96
100
  false
97
101
  end
98
- alias_method :exist?, :any?
99
- alias_method :exists?, :any?
102
+ def_delegator :self, :any?, :exist?
103
+ def_delegator :self, :any?, :exists?
100
104
 
101
105
  def all?
102
106
  return all? { |item| item } unless block_given?
103
107
  each { |item| return false unless yield(item) }
104
108
  true
105
109
  end
110
+ def_delegator :self, :all?, :forall?
106
111
 
107
112
  def none?
108
113
  return none? { |item| item } unless block_given?
@@ -115,11 +120,11 @@ module Hamster
115
120
  each { |item| return item if yield(item) }
116
121
  nil
117
122
  end
118
- alias_method :detect, :find
123
+ def_delegator :self, :find, :detect
119
124
 
120
125
  def partition(&block)
121
126
  return self unless block_given?
122
- Stream.new(filter(&block)) { Sequence.new(reject(&block)) }
127
+ Stream.new { Sequence.new(filter(&block), Sequence.new(reject(&block))) }
123
128
  end
124
129
 
125
130
  def grep(pattern, &block)
@@ -133,7 +138,15 @@ module Hamster
133
138
  def head
134
139
  find { true }
135
140
  end
136
- alias_method :first, :head
141
+ def_delegator :self, :head, :first
142
+
143
+ def product
144
+ reduce(1, &:*)
145
+ end
146
+
147
+ def sum
148
+ reduce(0, &:+)
149
+ end
137
150
 
138
151
  def sort(&block)
139
152
  to_list.sort(&block)
@@ -150,20 +163,21 @@ module Hamster
150
163
  def eql?(other)
151
164
  other.is_a?(self.class) && @trie.eql?(other.instance_eval{@trie})
152
165
  end
153
- alias_method :==, :eql?
166
+ def_delegator :self, :eql?, :==
154
167
 
155
168
  def dup
156
169
  self
157
170
  end
158
- alias_method :clone, :dup
159
- alias_method :uniq, :dup
160
- alias_method :nub, :dup
161
- alias_method :to_set, :dup
171
+ def_delegator :self, :dup, :clone
172
+ def_delegator :self, :dup, :uniq
173
+ def_delegator :self, :dup, :nub
174
+ def_delegator :self, :dup, :to_set
175
+ def_delegator :self, :dup, :remove_duplicates
162
176
 
163
177
  def to_a
164
178
  reduce([]) { |a, item| a << item }
165
179
  end
166
- alias_method :entries, :to_a
180
+ def_delegator :self, :to_a, :entries
167
181
 
168
182
  def to_list
169
183
  reduce(EmptyList) { |list, item| list.cons(item) }
data/lib/hamster/stack.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'forwardable'
2
+
1
3
  require 'hamster/list'
2
4
 
3
5
  module Hamster
@@ -8,6 +10,8 @@ module Hamster
8
10
 
9
11
  class Stack
10
12
 
13
+ extend Forwardable
14
+
11
15
  def initialize(list)
12
16
  @list = list
13
17
  end
@@ -19,7 +23,7 @@ module Hamster
19
23
  def size
20
24
  @list.size
21
25
  end
22
- alias_method :length, :size
26
+ def_delegator :self, :size, :length
23
27
 
24
28
  def top
25
29
  @list.head
@@ -28,7 +32,7 @@ module Hamster
28
32
  def push(item)
29
33
  self.class.new(@list.cons(item))
30
34
  end
31
- alias_method :<<, :push
35
+ def_delegator :self, :push, :<<
32
36
 
33
37
  def pop
34
38
  list = @list.tail
@@ -48,17 +52,17 @@ module Hamster
48
52
  return false unless other.class.equal?(self.class)
49
53
  @list.eql?(other.instance_eval{@list})
50
54
  end
51
- alias_method :==, :eql?
55
+ def_delegator :self, :eql?, :==
52
56
 
53
57
  def dup
54
58
  self
55
59
  end
56
- alias_method :clone, :dup
60
+ def_delegator :self, :dup, :clone
57
61
 
58
62
  def to_a
59
63
  @list.to_a
60
64
  end
61
- alias_method :entries, :to_a
65
+ def_delegator :self, :to_a, :entries
62
66
 
63
67
  def to_list
64
68
  @list
data/lib/hamster/trie.rb CHANGED
@@ -1,7 +1,11 @@
1
+ require 'forwardable'
2
+
1
3
  module Hamster
2
4
 
3
5
  class Trie
4
6
 
7
+ extend Forwardable
8
+
5
9
  def initialize(significant_bits = 0, entries = [], children = [])
6
10
  @significant_bits = significant_bits
7
11
  @entries = entries
@@ -94,7 +98,7 @@ module Hamster
94
98
  end
95
99
  true
96
100
  end
97
- alias_method :==, :eql?
101
+ def_delegator :self, :eql?, :==
98
102
 
99
103
  protected
100
104
 
@@ -1,5 +1,5 @@
1
1
  module Hamster
2
2
 
3
- VERSION = "0.1.23".freeze
3
+ VERSION = "0.2.0".freeze
4
4
 
5
5
  end
@@ -4,46 +4,50 @@ require 'hamster/hash'
4
4
 
5
5
  describe Hamster::Hash do
6
6
 
7
- describe "#all?" do
7
+ [:all?, :forall?].each do |method|
8
8
 
9
- describe "when empty" do
9
+ describe "##{method}" do
10
10
 
11
- before do
12
- @hash = Hamster.hash
13
- end
14
-
15
- it "with a block returns true" do
16
- @hash.all? {}.should == true
17
- end
11
+ describe "when empty" do
18
12
 
19
- it "with no block returns true" do
20
- @hash.all?.should == true
21
- end
13
+ before do
14
+ @hash = Hamster.hash
15
+ end
22
16
 
23
- end
17
+ it "with a block returns true" do
18
+ @hash.send(method) {}.should == true
19
+ end
24
20
 
25
- describe "when not empty" do
21
+ it "with no block returns true" do
22
+ @hash.send(method).should == true
23
+ end
26
24
 
27
- before do
28
- @hash = Hamster.hash("A" => "aye", "B" => "bee", "C" => "see")
29
25
  end
30
26
 
31
- describe "with a block" do
27
+ describe "when not empty" do
32
28
 
33
- it "returns true if the block always returns true" do
34
- @hash.all? { |key, value| true }.should == true
29
+ before do
30
+ @hash = Hamster.hash("A" => "aye", "B" => "bee", "C" => "see")
35
31
  end
36
32
 
37
- it "returns false if the block ever returns false" do
38
- @hash.all? { |key, value| key == "D" || value == "dee" }.should == false
33
+ describe "with a block" do
34
+
35
+ it "returns true if the block always returns true" do
36
+ @hash.send(method) { |key, value| true }.should == true
37
+ end
38
+
39
+ it "returns false if the block ever returns false" do
40
+ @hash.send(method) { |key, value| key == "D" || value == "dee" }.should == false
41
+ end
42
+
39
43
  end
40
44
 
41
- end
45
+ describe "with no block" do
42
46
 
43
- describe "with no block" do
47
+ it "returns true" do
48
+ @hash.send(method).should == true
49
+ end
44
50
 
45
- it "returns true" do
46
- @hash.all?.should == true
47
51
  end
48
52
 
49
53
  end
@@ -42,7 +42,7 @@ describe Hamster::Hash do
42
42
  describe "with no block" do
43
43
 
44
44
  before do
45
- @result = @original.send(method,"ABC")
45
+ @result = @original.send(method, "ABC")
46
46
  end
47
47
 
48
48
  it "returns the memo" do
@@ -0,0 +1,23 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ require 'hamster/hash'
4
+
5
+ describe Hamster::Hash do
6
+
7
+ before do
8
+ @hash = Hamster.hash("A" => "aye", "B" => "bee", "C" => "see")
9
+ end
10
+
11
+ [:uniq, :nub, :remove_duplicates].each do |method|
12
+
13
+ describe "##{method}" do
14
+
15
+ it "returns self" do
16
+ @hash.send(method).should equal(@hash)
17
+ end
18
+
19
+ end
20
+
21
+ end
22
+
23
+ end
@@ -4,98 +4,98 @@ require 'hamster/list'
4
4
 
5
5
  describe Hamster::List do
6
6
 
7
- describe "#all?" do
7
+ [:all?, :forall?].each do |method|
8
8
 
9
- describe "doesn't run out of stack space on a really big" do
9
+ describe "##{method}" do
10
10
 
11
- it "stream" do
12
- @list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
13
- end
11
+ describe "on a really big list" do
14
12
 
15
- it "list" do
16
- @list = (0...STACK_OVERFLOW_DEPTH).reduce(Hamster.list) { |list, i| list.cons(i) }
17
- end
13
+ before do
14
+ @list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
15
+ end
16
+
17
+ it "doesn't run out of stack" do
18
+ lambda { @list.send(method) }.should_not raise_error
19
+ end
18
20
 
19
- after do
20
- @list.all? { true }
21
21
  end
22
22
 
23
- end
23
+ describe "when empty" do
24
24
 
25
- describe "when empty" do
25
+ before do
26
+ @list = Hamster.list
27
+ end
26
28
 
27
- before do
28
- @list = Hamster.list
29
- end
29
+ it "with a block returns true" do
30
+ @list.send(method) {}.should == true
31
+ end
30
32
 
31
- it "with a block returns true" do
32
- @list.all? {}.should == true
33
- end
33
+ it "with no block returns true" do
34
+ @list.send(method).should == true
35
+ end
34
36
 
35
- it "with no block returns true" do
36
- @list.all?.should == true
37
37
  end
38
38
 
39
- end
39
+ describe "when not empty" do
40
40
 
41
- describe "when not empty" do
41
+ describe "with a block" do
42
42
 
43
- describe "with a block" do
43
+ before do
44
+ @list = Hamster.list("A", "B", "C")
45
+ end
44
46
 
45
- before do
46
- @list = Hamster.list("A", "B", "C")
47
- end
47
+ describe "if the block always returns true" do
48
48
 
49
- describe "if the block always returns true" do
49
+ before do
50
+ @result = @list.send(method) { |item| true }
51
+ end
50
52
 
51
- before do
52
- @result = @list.all? { |item| true }
53
- end
53
+ it "returns true" do
54
+ @result.should == true
55
+ end
54
56
 
55
- it "returns true" do
56
- @result.should == true
57
57
  end
58
58
 
59
- end
59
+ describe "if the block ever returns false" do
60
60
 
61
- describe "if the block ever returns false" do
61
+ before do
62
+ @result = @list.send(method) { |item| item == "D" }
63
+ end
62
64
 
63
- before do
64
- @result = @list.all? { |item| item == "D" }
65
- end
65
+ it "returns false" do
66
+ @result.should == false
67
+ end
66
68
 
67
- it "returns false" do
68
- @result.should == false
69
69
  end
70
70
 
71
71
  end
72
72
 
73
- end
73
+ describe "with no block" do
74
74
 
75
- describe "with no block" do
75
+ describe "if all values are truthy" do
76
76
 
77
- describe "if all values are truthy" do
77
+ before do
78
+ @result = Hamster.list(true, "A").send(method)
79
+ end
78
80
 
79
- before do
80
- @result = Hamster.list(true, "A").all?
81
- end
81
+ it "returns true" do
82
+ @result.should == true
83
+ end
82
84
 
83
- it "returns true" do
84
- @result.should == true
85
85
  end
86
86
 
87
- end
87
+ [nil, false].each do |value|
88
88
 
89
- [nil, false].each do |value|
89
+ describe "if any value is #{value.inspect}" do
90
90
 
91
- describe "if any value is #{value.inspect}" do
91
+ before do
92
+ @result = Hamster.list(value, true, "A").send(method)
93
+ end
92
94
 
93
- before do
94
- @result = Hamster.list(value, true, "A").all?
95
- end
95
+ it "returns false" do
96
+ @result.should == false
97
+ end
96
98
 
97
- it "returns false" do
98
- @result.should == false
99
99
  end
100
100
 
101
101
  end