public
Description: The web app builder for Rails
Homepage: http://hobocentral.net
Clone URL: git://github.com/tablatom/hobo.git
hobo / hobosupport / lib / hobosupport / enumerable.rb
100644 93 lines (70 sloc) 1.325 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
module Enumerable
 
  def map_and_find(not_found=nil)
    each do |x|
      val = yield(x)
      return val if val
    end
    not_found
  end
 
  def map_with_index
    res = []
    each_with_index {|x, i| res << yield(x, i)}
    res
  end
 
  def build_hash
    res = {}
    each do |x|
      pair = yield x
      res[pair.first] = pair.last if pair
    end
    res
  end
 
  def map_hash
    res = {}
    each do |x|
      v = yield x
      res[x] = v
    end
    res
  end
 
  def rest
    self[1..-1]
  end
 
  class MultiSender
 
    undef_method(*(instance_methods - %w*__id__ __send__*))
 
    def initialize(enumerable, method)
      @enumerable = enumerable
      @method = method
    end
 
    def method_missing(name, *args, &block)
      @enumerable.send(@method) { |x| x.send(name, *args, &block) }
    end
 
  end
 
  def *()
    MultiSender.new(self, :map)
  end
 
  def where
    MultiSender.new(self, :select)
  end
 
  def where_not
    MultiSender.new(self, :reject)
  end
 
  def drop_while
    drop = 0
    drop += 1 while yield(self[drop])
    self[drop..-1]
  end
 
 
  def take_while
    take = 0
    take += 1 while yield(self[take])
    self[0..take-1]
  end
 
end
 
 
class Object
 
  def in?(enum)
    !enum.nil? && enum.include?(self)
  end
 
  def not_in?(enum)
    enum.nil? || !enum.include?(self)
  end
 
end