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.
- checksums.yaml +4 -4
- data/lib/fds/unordered_set.rb +104 -12
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 754d8788b1b59154ab908e35ef3c4c8c449c10a7
|
4
|
+
data.tar.gz: f3be19ef9cc46fb2abb89ff25650f3032a95d885
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d6f3ffee9b435e745c78a2d96acaae03e1a4b8fdd1a99844ebbc795d39c48c528380f1577efe9e3687c56830616aa226fc5449cf7c9ad329892fe5dd7e5f3d45
|
7
|
+
data.tar.gz: 86ff877b9a3f381423f888b2a8f8b648f076552ed0c8db54f25c10029ac4ed46c10040d8024a1cbd78c7f875cb5f358d7d6c6e1f8fc9d56e8f20af2db536068d
|
data/lib/fds/unordered_set.rb
CHANGED
@@ -1,22 +1,114 @@
|
|
1
1
|
class FDS::UnorderedSet
|
2
2
|
def initialize
|
3
|
-
@
|
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)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
+
def add(e)
|
11
|
+
@data[e]
|
12
|
+
self
|
13
|
+
end
|
10
14
|
|
11
|
-
|
12
|
-
|
13
|
-
|
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
|
19
|
-
alias_method :
|
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.
|
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
|
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
|