mirror of https://gitee.com/bigwinds/arangodb
267 lines
4.4 KiB
Ruby
267 lines
4.4 KiB
Ruby
#
|
|
# Enumerable
|
|
#
|
|
module Enumerable
|
|
# 15.3.2.2.1
|
|
def all?(&block)
|
|
st = true
|
|
if block
|
|
self.each{|val|
|
|
unless block.call(val)
|
|
st = false
|
|
break
|
|
end
|
|
}
|
|
else
|
|
self.each{|val|
|
|
unless val
|
|
st = false
|
|
break
|
|
end
|
|
}
|
|
end
|
|
st
|
|
end
|
|
|
|
# 15.3.2.2.2
|
|
def any?(&block)
|
|
st = false
|
|
if block
|
|
self.each{|val|
|
|
if block.call(val)
|
|
st = true
|
|
break
|
|
end
|
|
}
|
|
else
|
|
self.each{|val|
|
|
if val
|
|
st = true
|
|
break
|
|
end
|
|
}
|
|
end
|
|
st
|
|
end
|
|
|
|
# 15.3.2.2.3
|
|
def collect(&block)
|
|
ary = []
|
|
self.each{|val|
|
|
ary.push(block.call(val))
|
|
}
|
|
ary
|
|
end
|
|
|
|
# 15.3.2.2.4
|
|
def detect(ifnone=nil, &block)
|
|
ret = ifnone
|
|
self.each{|val|
|
|
if block.call(val)
|
|
ret = val
|
|
break
|
|
end
|
|
}
|
|
ret
|
|
end
|
|
|
|
# 15.3.2.2.5
|
|
def each_with_index(&block)
|
|
i = 0
|
|
self.each{|val|
|
|
block.call(val, i)
|
|
i += 1
|
|
}
|
|
self
|
|
end
|
|
|
|
# 15.3.2.2.6
|
|
def entries
|
|
ary = []
|
|
self.each{|val|
|
|
ary.push val
|
|
}
|
|
ary
|
|
end
|
|
|
|
# 15.3.2.2.7
|
|
# find(ifnone=nil, &block)
|
|
alias find detect
|
|
|
|
# 15.3.2.2.8
|
|
def find_all(&block)
|
|
ary = []
|
|
self.each{|val|
|
|
ary.push(val) if block.call(val)
|
|
}
|
|
ary
|
|
end
|
|
|
|
# 15.3.2.2.9
|
|
def grep(pattern, &block)
|
|
ary = []
|
|
self.each{|val|
|
|
if pattern === val
|
|
ary.push((block)? block.call(val): val)
|
|
end
|
|
}
|
|
ary
|
|
end
|
|
|
|
# 15.3.2.2.10
|
|
def include?(obj)
|
|
st = false
|
|
self.each{|val|
|
|
if val == obj
|
|
st = true
|
|
break
|
|
end
|
|
}
|
|
st
|
|
end
|
|
|
|
# 15.3.2.2.11
|
|
def inject(*args, &block)
|
|
raise ArgumentError, "too many arguments" if args.size > 2
|
|
flag = true # 1st element?
|
|
result = nil
|
|
self.each{|val|
|
|
if flag
|
|
# 1st element
|
|
result = (args.empty?)? val: block.call(args[0], val)
|
|
flag = false
|
|
else
|
|
result = block.call(result, val)
|
|
end
|
|
}
|
|
result
|
|
end
|
|
|
|
# 15.3.2.2.12
|
|
# map(&block)
|
|
alias map collect
|
|
|
|
# 15.3.2.2.13
|
|
def max(&block)
|
|
flag = true # 1st element?
|
|
result = nil
|
|
self.each{|val|
|
|
if flag
|
|
# 1st element
|
|
result = val
|
|
flag = false
|
|
else
|
|
if block
|
|
result = val if block.call(val, result) > 0
|
|
else
|
|
result = val if (val <=> result) > 0
|
|
end
|
|
end
|
|
}
|
|
result
|
|
end
|
|
|
|
# 15.3.2.2.14
|
|
def min(&block)
|
|
flag = true # 1st element?
|
|
result = nil
|
|
self.each{|val|
|
|
if flag
|
|
# 1st element
|
|
result = val
|
|
flag = false
|
|
else
|
|
if block
|
|
result = val if block.call(val, result) < 0
|
|
else
|
|
result = val if (val <=> result) < 0
|
|
end
|
|
end
|
|
}
|
|
result
|
|
end
|
|
|
|
# 15.3.2.2.15
|
|
# member?(obj)
|
|
alias member? include?
|
|
|
|
# 15.3.2.2.16
|
|
def partition(&block)
|
|
ary_T = []
|
|
ary_F = []
|
|
self.each{|val|
|
|
if block.call(val)
|
|
ary_T.push(val)
|
|
else
|
|
ary_F.push(val)
|
|
end
|
|
}
|
|
[ary_T, ary_F]
|
|
end
|
|
|
|
# 15.3.2.2.17
|
|
def reject(&block)
|
|
ary = []
|
|
self.each{|val|
|
|
ary.push(val) unless block.call(val)
|
|
}
|
|
ary
|
|
end
|
|
|
|
# 15.3.2.2.18
|
|
# select(&block)
|
|
alias select find_all
|
|
|
|
|
|
# Does this OK? Please test it.
|
|
def __sort_sub__(sorted, work, src_ary, head, tail, &block)
|
|
if head == tail
|
|
sorted[head] = work[head] if src_ary == 1
|
|
return
|
|
end
|
|
|
|
# on current step, which is a src ary?
|
|
if src_ary == 0
|
|
src, dst = sorted, work
|
|
else
|
|
src, dst = work, sorted
|
|
end
|
|
|
|
key = src[head] # key value for dividing values
|
|
i, j = head, tail # position to store on the dst ary
|
|
|
|
(head + 1).upto(tail){|idx|
|
|
if ((block)? block.call(src[idx], key): (src[idx] <=> key)) > 0
|
|
# larger than key
|
|
dst[j] = src[idx]
|
|
j -= 1
|
|
else
|
|
dst[i] = src[idx]
|
|
i += 1
|
|
end
|
|
}
|
|
|
|
sorted[i] = key
|
|
|
|
# sort each sub-array
|
|
src_ary = (src_ary + 1) % 2 # exchange a src ary
|
|
__sort_sub__(sorted, work, src_ary, head, i - 1, &block) if i > head
|
|
__sort_sub__(sorted, work, src_ary, i + 1, tail, &block) if i < tail
|
|
end
|
|
# private :__sort_sub__
|
|
|
|
# 15.3.2.2.19
|
|
def sort(&block)
|
|
ary = []
|
|
self.each{|val| ary.push(val)}
|
|
unless ary.empty?
|
|
__sort_sub__(ary, ::Array.new(ary.size), 0, 0, ary.size - 1, &block)
|
|
end
|
|
ary
|
|
end
|
|
|
|
# 15.3.2.2.20
|
|
# to_a
|
|
alias to_a entries
|
|
end
|