fds 0.0.2 → 0.0.3

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 (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/fds/unordered_set.rb +104 -12
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7197a33674f63af8e1198fd11e98bb245166eeff
4
- data.tar.gz: 6443d278baeb5fa132bd34f1e75c09e74818b312
3
+ metadata.gz: 754d8788b1b59154ab908e35ef3c4c8c449c10a7
4
+ data.tar.gz: f3be19ef9cc46fb2abb89ff25650f3032a95d885
5
5
  SHA512:
6
- metadata.gz: 38d024bfabb21720ec9a64dcb4c0562b1999f0757d245ee04a1ed24344f1b0a640b01b90d0b226241c9f7f140ac9130295556cec2deef19f212df45e707eabc3
7
- data.tar.gz: 67660c36874db7a0f4f7e012bd3343c4070ef3bba5496a0e4825089396ac7617ce273e8de7e79feaea7087d82f024444dcaf7aec48479bb4801e471b676e931f
6
+ metadata.gz: d6f3ffee9b435e745c78a2d96acaae03e1a4b8fdd1a99844ebbc795d39c48c528380f1577efe9e3687c56830616aa226fc5449cf7c9ad329892fe5dd7e5f3d45
7
+ data.tar.gz: 86ff877b9a3f381423f888b2a8f8b648f076552ed0c8db54f25c10029ac4ed46c10040d8024a1cbd78c7f875cb5f358d7d6c6e1f8fc9d56e8f20af2db536068d
@@ -1,22 +1,114 @@
1
1
  class FDS::UnorderedSet
2
2
  def initialize
3
- @data = Hash.new { |h, e| h[e] = h.size }
3
+ @index = 0
4
+ @data = Hash.new do |h, e|
5
+ h[e] = @index
6
+ @index += 1
7
+ end
4
8
  end
5
9
 
6
- def add(e); @data[e]; self; end
7
- def find_index(e); @data[e] if @data.has_key?(e); end
8
- def remove(e); @data[e] = nil; end
9
- def size; @data.size; end
10
+ def add(e)
11
+ @data[e]
12
+ self
13
+ end
10
14
 
11
- [:to_s, :first, :last, :to_a].each do |function|
12
- define_method function do
13
- @data.keys.send(function)
15
+ def find_index(e)
16
+ # @data.has_key? is needed otherwise @data will create a new element,
17
+ # see @data definition in #initialize.
18
+ @data[e] if @data.has_key?(e)
19
+ end
20
+
21
+ def delete(e)
22
+ @data.delete(e)
23
+ self
24
+ end
25
+
26
+ def size
27
+ @data.size
28
+ end
29
+
30
+ def each
31
+ @data.each_key(&proc)
32
+ end
33
+
34
+ def include?(e)
35
+ find_index(e) != nil
36
+ end
37
+
38
+ def delete_if
39
+ @data.delete_if { |k, _| yield k }
40
+ self
41
+ end
42
+
43
+ def keep_if
44
+ @data.keep_if { |k, _| yield k }
45
+ self
46
+ end
47
+
48
+ def |(other)
49
+ if self.size > other.size
50
+ result = self.dup
51
+ smaller_set = other
52
+ else
53
+ result = other.dup
54
+ smaller_set = self
55
+ end
56
+
57
+ smaller_set.each do |e|
58
+ result << e
14
59
  end
60
+
61
+ result
62
+ end
63
+
64
+ def &(other)
65
+ if self.size < other.size
66
+ result = self.dup
67
+ bigger_set = other
68
+ else
69
+ result = other.dup
70
+ bigger_set = self
71
+ end
72
+
73
+ result.keep_if do |e|
74
+ bigger_set.include?(e)
75
+ end
76
+
77
+ result
78
+ end
79
+
80
+ def first
81
+ @data.each_key { |k| return k }
82
+ nil
83
+ end
84
+
85
+ def last
86
+ # All keys are read through, but no intermediate array is created as
87
+ # whereas "keys.last" accumulates all keys for nothing.
88
+ # We can't use @data.each_key.last, because there's no Enumerable#last. :/
89
+ @data.reverse_each { |k, _| return k }
90
+ nil
91
+ end
92
+
93
+ def to_a
94
+ @data.keys
95
+ end
96
+
97
+ def to_s
98
+ to_a.to_s
99
+ end
100
+
101
+ =begin
102
+ [:to_s, :first, :last, :to_a].each do |function|
103
+ class_eval(<<-EOF, __FILE__, __LINE__ + 1)
104
+ def #{function}
105
+ @data.keys.#{function}
106
+ end
107
+ EOF
15
108
  end
109
+ =end
16
110
 
17
111
  alias_method :<<, :add
18
- alias_method :+, :add # Should probably try to copy original Set behaviour
19
- alias_method :rm, :remove
20
- alias_method :del, :remove
21
- alias_method :delete, :remove
112
+ alias_method :union, :|
113
+ alias_method :intersection, :&
22
114
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fds
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Charbonnel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-28 00:00:00.000000000 Z
11
+ date: 2016-10-09 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Providing fast data structures for everyday Ruby
14
14
  email: thomas@charbonnel.email