Class: Set

Inherits:
Object show all
Includes:
Enumerable
Defined in:
mruby/mrbgems/mruby-set/mrblib/set.rb

Constant Summary

Constants included from Enumerable

Enumerable::NONE

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Enumerable

__update_hash, #all?, #any?, #chain, #collect, #count, #cycle, #detect, #drop, #drop_while, #each_cons, #each_slice, #each_with_index, #each_with_object, #entries, #filter_map, #find_all, #find_index, #first, #flat_map, #grep, #group_by, #inject, #lazy, #max, #max_by, #min, #min_by, #minmax, #minmax_by, #none?, #one?, #partition, #reject, #reverse_each, #sort, #sort_by, #sum, #take, #take_while, #tally, #to_h, #uniq, #zip

Constructor Details

#initialize(enum = nil, &block) ⇒ Set

Returns a new instance of Set.



22
23
24
25
26
27
28
29
30
31
32
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 22

def initialize(enum = nil, &block)
  @hash ||= Hash.new

  enum.nil? and return

  if block_given?
    __do_with_enum(enum) { |o| add(block.call(o)) }
  else
    merge(enum)
  end
end

Class Method Details

.[](*ary) ⇒ Object



18
19
20
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 18

def self.[](*ary)
  new(ary)
end

Instance Method Details

#&(enum) ⇒ Object Also known as: intersection



241
242
243
244
245
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 241

def &(enum)
  n = Set.new
  __do_with_enum(enum) { |o| n.add(o) if include?(o) }
  n
end

#-(enum) ⇒ Object Also known as: difference



236
237
238
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 236

def -(enum)
  dup.subtract(enum)
end

#<=>(set) ⇒ Object



264
265
266
267
268
269
270
271
272
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 264

def <=>(set)
  return unless set.is_a?(Set)

  case size <=> set.size
  when -1 then -1 if proper_subset?(set)
  when +1 then +1 if proper_superset?(set)
  else 0 if self.==(set)
  end
end

#==(other) ⇒ Object



252
253
254
255
256
257
258
259
260
261
262
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 252

def ==(other)
  if self.equal?(other)
    true
  elsif other.instance_of?(self.class) && self.size == other.size
    @hash == other.__get_hash
  elsif other.is_a?(self.class) && self.size == other.size
    other.all? { |o| include?(o) }
  else
    false
  end
end

#^(enum) ⇒ Object



248
249
250
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 248

def ^(enum)
  (self | Set.new(enum)) - (self & Set.new(enum))
end

#__do_with_enum(enum, &block) ⇒ Object

internal method



5
6
7
8
9
10
11
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 5

def __do_with_enum(enum, &block)
  if enum.respond_to?(:each)
    enum.each(&block)
  else
    raise ArgumentError, "value must be enumerable"
  end
end

#__get_hashObject

internal method to get internal hash



14
15
16
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 14

def __get_hash
  @hash
end

#_inspect(recur_list) ⇒ Object



309
310
311
312
313
314
315
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 309

def _inspect(recur_list)
  return "#<#{self.class}: {}>" if empty?
  return "#<#{self.class}: {...}>" if recur_list[self.object_id]
  recur_list[self.object_id] = true
  ary = map { |o| o._inspect(recur_list) }
  "#<#{self.class}: {#{ary.join(", ")}}>"
end

#add(o) ⇒ Object Also known as: <<



153
154
155
156
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 153

def add(o)
  @hash[o] = true
  self
end

#add?(o) ⇒ Boolean

Returns:

  • (Boolean)


159
160
161
162
163
164
165
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 159

def add?(o)
  if include?(o)
    nil
  else
    add(o)
  end
end

#classifyObject



283
284
285
286
287
288
289
290
291
292
293
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 283

def classify
  return to_enum :classify unless block_given?
  h = {}

  each { |i|
    x = yield(i)
    (h[x] ||= self.class.new).add(i)
  }

  h
end

#clearObject



53
54
55
56
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 53

def clear
  @hash.clear
  self
end

#collect!Object Also known as: map!



192
193
194
195
196
197
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 192

def collect!
 return to_enum :collect! unless block_given?
 set = self.class.new
 each { |o| set << yield(o) }
 replace(set)
end

#delete(o) ⇒ Object



167
168
169
170
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 167

def delete(o)
  @hash.delete(o)
  self
end

#delete?(o) ⇒ Boolean

Returns:

  • (Boolean)


172
173
174
175
176
177
178
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 172

def delete?(o)
  if include?(o)
    delete(o)
  else
    nil
  end
end

#delete_ifObject



180
181
182
183
184
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 180

def delete_if
  return to_enum :delete_if unless block_given?
  select { |o| yield o }.each { |o| @hash.delete(o) }
  self
end

#disjoint?(set) ⇒ Boolean

Returns:

  • (Boolean)


143
144
145
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 143

def disjoint?(set)
 !intersect?(set)
end

#divide(&func) ⇒ Object



295
296
297
298
299
300
301
302
303
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 295

def divide(&func)
  return to_enum :divide unless block_given?

  if func.arity == 2
    raise NotImplementedError, "Set#divide with 2 arity block is not implemented."
  end

  Set.new(classify(&func).values)
end

#each(&block) ⇒ Object



147
148
149
150
151
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 147

def each(&block)
  return to_enum :each unless block_given?
  @hash.each_key(&block)
  self
end

#empty?Boolean

Returns:

  • (Boolean)


49
50
51
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 49

def empty?
  @hash.empty?
end

#eql?(o) ⇒ Boolean

Returns:

  • (Boolean)


278
279
280
281
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 278

def eql?(o)
  return false unless o.is_a?(Set)
  @hash.eql?(o.__get_hash)
end

#flattenObject



88
89
90
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 88

def flatten
  self.class.new.flatten_merge(self)
end

#flatten!Object



92
93
94
95
96
97
98
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 92

def flatten!
  if detect { |e| e.is_a?(Set) }
    replace(flatten())
  else
    nil
  end
end

#flatten_merge(set, seen = Set.new) ⇒ Object

def to_set

end


70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 70

def flatten_merge(set, seen = Set.new)
  seen.add(set.object_id)
  set.each { |e|
    if e.is_a?(Set)
      if seen.include?(e_id = e.object_id)
        raise ArgumentError, "tried to flatten recursive Set"
      end

      flatten_merge(e, seen)
    else
      add(e)
    end
  }
  seen.delete(set.object_id)

  self
end

#hashObject



274
275
276
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 274

def hash
  @hash.hash
end

#include?(o) ⇒ Boolean Also known as: member?, ===

Returns:

  • (Boolean)


100
101
102
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 100

def include?(o)
  @hash.include?(o)
end

#initialize_copy(orig) ⇒ Object



34
35
36
37
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 34

def initialize_copy(orig)
  super
  @hash = orig.__get_hash.dup
end

#inspectObject Also known as: to_s



317
318
319
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 317

def inspect
  _inspect({})
end

#intersect?(set) ⇒ Boolean

Returns:

  • (Boolean)

Raises:



134
135
136
137
138
139
140
141
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 134

def intersect?(set)
  raise ArgumentError, "value must be a set" unless set.is_a?(Set)
  if size < set.size
    any? { |o| set.include?(o) }
  else
    set.any? { |o| include?(o) }
  end
end

#join(separator = nil) ⇒ Object



305
306
307
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 305

def join(separator = nil)
  to_a.join(separator)
end

#keep_ifObject



186
187
188
189
190
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 186

def keep_if
  return to_enum :keep_if unless block_given?
  reject { |o| yield o }.each { |o| @hash.delete(o) }
  self
end

#merge(enum) ⇒ Object



215
216
217
218
219
220
221
222
223
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 215

def merge(enum)
  if enum.instance_of?(self.class)
    @hash.merge!(enum.__get_hash)
  else
    __do_with_enum(enum) { |o| add(o) }
  end

  self
end

#proper_subset?(set) ⇒ Boolean Also known as: <

Returns:

  • (Boolean)

Raises:



127
128
129
130
131
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 127

def proper_subset?(set)
  raise ArgumentError, "value must be a set" unless set.is_a?(Set)
  return false if set.size <= size
  all? { |o| set.include?(o) }
end

#proper_superset?(set) ⇒ Boolean Also known as: >

Returns:

  • (Boolean)

Raises:



113
114
115
116
117
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 113

def proper_superset?(set)
  raise ArgumentError, "value must be a set" unless set.is_a?(Set)
  return false if size <= set.size
  set.all? { |o| include?(o) }
end

#reject!(&block) ⇒ Object



200
201
202
203
204
205
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 200

def reject!(&block)
  return to_enum :reject! unless block_given?
  n = size
  delete_if(&block)
  size == n ? nil : self
end

#replace(enum) ⇒ Object



58
59
60
61
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 58

def replace(enum)
  clear
  merge(enum)
end

#resetObject



322
323
324
325
326
327
328
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 322

def reset
  if frozen?
    raise FrozenError, "can't modify frozen Set"
  else
    @hash.rehash
  end
end

#select!(&block) ⇒ Object Also known as: filter!



207
208
209
210
211
212
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 207

def select!(&block)
  return to_enum :select! unless block_given?
  n = size
  keep_if(&block)
  size == n ? nil : self
end

#sizeObject Also known as: length

def freeze

@hash.freeze
super

end



44
45
46
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 44

def size
  @hash.size
end

#subset?(set) ⇒ Boolean Also known as: <=

Returns:

  • (Boolean)

Raises:



120
121
122
123
124
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 120

def subset?(set)
  raise ArgumentError, "value must be a set" unless set.is_a?(Set)
  return false if set.size < size
  all? { |o| set.include?(o) }
end

#subtract(enum) ⇒ Object



225
226
227
228
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 225

def subtract(enum)
  __do_with_enum(enum) { |o| delete(o) }
  self
end

#superset?(set) ⇒ Boolean Also known as: >=

Returns:

  • (Boolean)

Raises:



106
107
108
109
110
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 106

def superset?(set)
  raise ArgumentError, "value must be a set" unless set.is_a?(Set)
  return false if size < set.size
  set.all? { |o| include?(o) }
end

#to_aObject



63
64
65
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 63

def to_a
  @hash.keys
end

#|(enum) ⇒ Object Also known as: +, union



230
231
232
# File 'mruby/mrbgems/mruby-set/mrblib/set.rb', line 230

def |(enum)
  dup.merge(enum)
end