Temporary tag for this failure. Updated CI spec coming.
[rbx.git] / kernel / core / tuple.rb
blobcf358dbad378f75cf261ee6dcce5f0dec80c36cb
1 # depends on: class.rb module.rb
3 class Tuple
5   include Enumerable
7   def self.[](*args)
8     sz = args.size
9     tup = new(sz)
10     i = 0
11     while i < sz
12       tup.put i, args[i]
13       i += 1
14     end
16     return tup
17   end
19   def to_s
20     "#<Tuple:0x#{object_id.to_s(16)} #{fields} elements>"
21   end
23   def each
24     i = 0
25     t = fields
26     while i < t
27       yield self.at(i)
28       i += 1
29     end
30     self
31   end
33   def inspect
34     str = "#<Tuple"
35     if fields != 0
36       str << ": #{join(", ", :inspect)}"
37     end
38     str << ">"
39     return str
40   end
42   def join(sep, meth=:to_s)
43     join_upto(sep, fields, meth)
44   end
46   def join_upto(sep, count, meth=:to_s)
47     str = ""
48     return str if count == 0 or empty?
49     count = fields if count >= fields
50     count -= 1
51     i = 0
52     while i < count
53       str << at(i).__send__(meth)
54       str << sep.dup
55       i += 1
56     end
57     str << at(count).__send__(meth)
58     return str
59   end
61   def ===(other)
62     return false unless Tuple === other and fields == other.fields
63     i = 0
64     while i < fields
65       return false unless at(i) === other.at(i)
66       i += 1
67     end
68     true
69   end
71   def to_a
72     ary = []
73     each do |ent|
74       ary << ent
75     end
76     return ary
77   end
79   def shift
80     return self unless fields > 0
81     t = Tuple.new(fields-1)
82     t.copy_from self, 1, 0
83     return t
84   end
86   # Swap elements of the two indexes.
87   def swap(a, b)
88     temp = at(a)
89     put(a, at(b))
90     put(b, temp)
91   end
93   def enlarge(size)
94     if size > fields()
95       t = Tuple.new(size)
96       t.copy_from self, 0, 0
97       return t
98     end
100     return self
101   end
103   alias_method :size, :fields
104   alias_method :length, :fields
106   def empty?
107     size == 0
108   end
110   def first
111     at(0)
112   end
114   def last
115     at(fields-1)
116   end