@@ -38,6 +38,166 @@ object opaques
3838 def (arr : IArray [Double ]) length : Int = arr.asInstanceOf [Array [Double ]].length
3939 def (arr : IArray [Object ]) length : Int = arr.asInstanceOf [Array [Object ]].length
4040 def [T ](arr : IArray [T ]) length : Int = arr.asInstanceOf [Array [T ]].length
41+
42+ /** All the methods on Array[T] that don't mutate in-place can be used with IArray[T].
43+ */
44+ def [T , U >: T : ClassTag ](arr : IArray [T ]) ++ (that : IArray [U ]): IArray [U ] =
45+ (arr.asInstanceOf [Array [T ]] ++ that.asInstanceOf [Array [U ]]).asInstanceOf
46+
47+ def [T ](arr : IArray [T ])contains(elem : T ): Boolean =
48+ arr.asInstanceOf [Array [T ]].contains(elem)
49+
50+ def [T ](arr : IArray [T ]) count(p : T => Boolean ): Int =
51+ arr.asInstanceOf [Array [T ]].count(p)
52+
53+ def [T ](arr : IArray [T ]) drop(n : Int ): IArray [T ] =
54+ arr.asInstanceOf [Array [T ]].drop(n).asInstanceOf
55+
56+ def [T ](arr : IArray [T ]) dropRight(n : Int ): IArray [T ] =
57+ arr.asInstanceOf [Array [T ]].dropRight(n).asInstanceOf
58+
59+ def [T ](arr : IArray [T ]) dropWhile(p : T => Boolean ): IArray [T ] =
60+ arr.asInstanceOf [Array [T ]].dropWhile(p).asInstanceOf
61+
62+ def [T ](arr : IArray [T ]) exists(p : T => Boolean ): IArray [T ] =
63+ arr.asInstanceOf [Array [T ]].exists(p).asInstanceOf
64+
65+ def [T ](arr : IArray [T ]) filter(p : T => Boolean ): IArray [T ] =
66+ arr.asInstanceOf [Array [T ]].filter(p).asInstanceOf
67+
68+ def [T ](arr : IArray [T ]) filterNot(p : T => Boolean ): IArray [T ] =
69+ arr.asInstanceOf [Array [T ]].filterNot(p).asInstanceOf
70+
71+ def [T ](arr : IArray [T ]) find(p : T => Boolean ): Option [T ] =
72+ arr.asInstanceOf [Array [T ]].find(p).asInstanceOf
73+
74+ def [T , U : ClassTag ](arr : IArray [T ]) flatMap(f : T => IterableOnce [U ]): IArray [U ] =
75+ arr.asInstanceOf [Array [T ]].flatMap(f).asInstanceOf
76+
77+ def [T , U : ClassTag ](arr : IArray [T ]) flatten(given T => Iterable [U ]): IArray [U ] =
78+ arr.asInstanceOf [Array [T ]].flatten.asInstanceOf
79+
80+ def [T , U >: T : ClassTag ](arr : IArray [T ]) fold(z : U )(op : (U , U ) => U ): U =
81+ arr.asInstanceOf [Array [T ]].fold(z)(op).asInstanceOf
82+
83+ def [T , U >: T : ClassTag ](arr : IArray [T ]) foldLeft(z : U )(op : (U , T ) => U ): U =
84+ arr.asInstanceOf [Array [T ]].foldLeft(z)(op).asInstanceOf
85+
86+ def [T , U >: T : ClassTag ](arr : IArray [T ]) foldRight(z : U )(op : (T , U ) => U ): U =
87+ arr.asInstanceOf [Array [T ]].foldRight(z)(op).asInstanceOf
88+
89+ def [T ](arr : IArray [T ]) forall(p : T => Boolean ): Boolean =
90+ arr.asInstanceOf [Array [T ]].forall(p)
91+
92+ def [T , U ](arr : IArray [T ]) foreach(f : T => U ): Unit =
93+ arr.asInstanceOf [Array [T ]].foreach(f)
94+
95+ def [T ](arr : IArray [T ]) head : T =
96+ arr.asInstanceOf [Array [T ]].head
97+
98+ def [T ](arr : IArray [T ]) headOption : Option [T ] =
99+ arr.asInstanceOf [Array [T ]].headOption
100+
101+ def [T ](arr : IArray [T ]) indexOf(elem : T , from : Int = 0 ): Int =
102+ arr.asInstanceOf [Array [T ]].indexOf(elem, from)
103+
104+ def [T ](arr : IArray [T ]) indexWhere(p : T => Boolean , from : Int = 0 ): Int =
105+ arr.asInstanceOf [Array [T ]].indexWhere(p, from)
106+
107+ def [T ](arr : IArray [T ]) indices : Range =
108+ arr.asInstanceOf [Array [T ]].indices.asInstanceOf
109+
110+ def [T ](arr : IArray [T ]) init : IArray [T ] =
111+ arr.asInstanceOf [Array [T ]].init.asInstanceOf
112+
113+ def [T ](arr : IArray [T ]) isEmpty : Boolean =
114+ arr.asInstanceOf [Array [T ]].isEmpty
115+
116+ def [T ](arr : IArray [T ]) iterator : Iterator [T ] =
117+ arr.asInstanceOf [Array [T ]].iterator
118+
119+ def [T ](arr : IArray [T ]) last : T =
120+ arr.asInstanceOf [Array [T ]].last
121+
122+ def [T ](arr : IArray [T ]) lastOption : Option [T ] =
123+ arr.asInstanceOf [Array [T ]].lastOption
124+
125+ def [T ](arr : IArray [T ]) lastIndexOf(elem : T , from : Int = 0 ): Int =
126+ arr.asInstanceOf [Array [T ]].lastIndexOf(elem, from)
127+
128+ def [T ](arr : IArray [T ]) lastIndexWhere(p : T => Boolean , from : Int = 0 ): Int =
129+ arr.asInstanceOf [Array [T ]].lastIndexWhere(p, from)
130+
131+ def [T , U : ClassTag ](arr : IArray [T ]) map(f : T => U ): IArray [U ] =
132+ arr.asInstanceOf [Array [T ]].map(f).asInstanceOf
133+
134+ def [T ](arr : IArray [T ]) nonEmpty : Boolean =
135+ arr.asInstanceOf [Array [T ]].nonEmpty
136+
137+ def [T ](arr : IArray [T ]) partition(p : T => Boolean ): (IArray [T ], IArray [T ]) =
138+ arr.asInstanceOf [Array [T ]].partition(p) match {
139+ case (x, y) => (x.asInstanceOf [IArray [T ]], y.asInstanceOf [IArray [T ]])
140+ }
141+
142+ def [T ](arr : IArray [T ]) reverse : IArray [T ] =
143+ arr.asInstanceOf [Array [T ]].reverse.asInstanceOf
144+
145+ def [T , U >: T : ClassTag ](arr : IArray [T ]) scan(z : U )(op : (U , U ) => U ): Array [U ] =
146+ arr.asInstanceOf [Array [T ]].scan(z)(op).asInstanceOf
147+
148+ def [T , U : ClassTag ](arr : IArray [T ]) scanLeft(z : U )(op : (U , T ) => U ): Array [U ] =
149+ arr.asInstanceOf [Array [T ]].scanLeft(z)(op).asInstanceOf
150+
151+ def [T , U : ClassTag ](arr : IArray [T ]) scanRight(z : U )(op : (T , U ) => U ): Array [U ] =
152+ arr.asInstanceOf [Array [T ]].scanRight(z)(op).asInstanceOf
153+
154+ def [T ](arr : IArray [T ]) size : Int =
155+ arr.asInstanceOf [Array [T ]].size
156+
157+ def [T ](arr : IArray [T ]) slice(from : Int , until : Int ): Array [T ] =
158+ arr.asInstanceOf [Array [T ]].slice(from, until).asInstanceOf
159+
160+ def [T , U : ClassTag ](arr : IArray [T ]) sortBy(f : T => U )(given math .Ordering [U ]): IArray [T ] =
161+ arr.asInstanceOf [Array [T ]].sortBy(f).asInstanceOf
162+
163+ def [T ](arr : IArray [T ]) sortWith(f : (T , T ) => Boolean ): IArray [T ] =
164+ arr.asInstanceOf [Array [T ]].sortWith(f).asInstanceOf
165+
166+ def [T ](arr : IArray [T ]) sorted(given math .Ordering [T ]): IArray [T ] =
167+ arr.asInstanceOf [Array [T ]].sorted.asInstanceOf
168+
169+ def [T ](arr : IArray [T ]) span(p : T => Boolean ): (IArray [T ], IArray [T ]) =
170+ arr.asInstanceOf [Array [T ]].span(p) match {
171+ case (x, y) => (x.asInstanceOf [IArray [T ]], y.asInstanceOf [IArray [T ]])
172+ }
173+
174+ def [T ](arr : IArray [T ]) splitAt(n : Int ): (IArray [T ], IArray [T ]) =
175+ arr.asInstanceOf [Array [T ]].splitAt(n) match {
176+ case (x, y) => (x.asInstanceOf [IArray [T ]], y.asInstanceOf [IArray [T ]])
177+ }
178+
179+ def [T , U >: T : ClassTag ](arr : IArray [T ]) startsWith(that : IArray [U ], offset : Int = 0 ): Boolean =
180+ arr.asInstanceOf [Array [T ]].startsWith(that.asInstanceOf [Array [U ]])
181+
182+ def [T ](arr : IArray [T ]) tail : IArray [T ] =
183+ arr.asInstanceOf [Array [T ]].tail.asInstanceOf
184+
185+ def [T ](arr : IArray [T ]) take(n : Int ): IArray [T ] =
186+ arr.asInstanceOf [Array [T ]].take(n).asInstanceOf
187+
188+ def [T ](arr : IArray [T ]) takeRight(n : Int ): IArray [T ] =
189+ arr.asInstanceOf [Array [T ]].takeRight(n).asInstanceOf
190+
191+ def [T ](arr : IArray [T ]) takeWhile(p : T => Boolean ): IArray [T ] =
192+ arr.asInstanceOf [Array [T ]].takeWhile(p).asInstanceOf
193+
194+ // def [T, U: ClassTag, V: ClassTag](arr: IArray[T]) unzip(given T => (U, V)): (IArray[U], IArray[V]) =
195+ // arr.asInstanceOf[Array[T]].unzip match {
196+ // case (x, y) => (x.asInstanceOf[IArray[U]], y.asInstanceOf[IArray[V]])
197+ // }
198+
199+ def [T , U : ClassTag ](arr : IArray [T ]) zip(that : IterableOnce [U ]): IArray [(T , U )] =
200+ arr.asInstanceOf [Array [T ]].zip(that).asInstanceOf
41201end opaques
42202
43203type IArray [+ T ] = opaques.IArray [T ]
@@ -223,168 +383,4 @@ object IArray {
223383 * @return sequence wrapped in a [[scala.Some ]], if `x` is a Seq, otherwise `None`
224384 */
225385 def unapplySeq [T ](x : IArray [T ]) = Array .unapplySeq[T ](x.asInstanceOf [Array [T ]])
226-
227-
228-
229- /** All the methods on Array[T] that don't mutate in-place can be used with IArray[T].
230- */
231- given arrayOps : Object {
232- def [T , U >: T : ClassTag ](arr : IArray [T ]) ++ (that : IArray [U ]): IArray [U ] =
233- (arr.asInstanceOf [Array [T ]] ++ that.asInstanceOf [Array [U ]]).asInstanceOf
234-
235- def [T ](arr : IArray [T ])contains(elem : T ): Boolean =
236- arr.asInstanceOf [Array [T ]].contains(elem)
237-
238- def [T ](arr : IArray [T ]) count(p : T => Boolean ): Int =
239- arr.asInstanceOf [Array [T ]].count(p)
240-
241- def [T ](arr : IArray [T ]) drop(n : Int ): IArray [T ] =
242- arr.asInstanceOf [Array [T ]].drop(n).asInstanceOf
243-
244- def [T ](arr : IArray [T ]) dropRight(n : Int ): IArray [T ] =
245- arr.asInstanceOf [Array [T ]].dropRight(n).asInstanceOf
246-
247- def [T ](arr : IArray [T ]) dropWhile(p : T => Boolean ): IArray [T ] =
248- arr.asInstanceOf [Array [T ]].dropWhile(p).asInstanceOf
249-
250- def [T ](arr : IArray [T ]) exists(p : T => Boolean ): IArray [T ] =
251- arr.asInstanceOf [Array [T ]].exists(p).asInstanceOf
252-
253- def [T ](arr : IArray [T ]) filter(p : T => Boolean ): IArray [T ] =
254- arr.asInstanceOf [Array [T ]].filter(p).asInstanceOf
255-
256- def [T ](arr : IArray [T ]) filterNot(p : T => Boolean ): IArray [T ] =
257- arr.asInstanceOf [Array [T ]].filterNot(p).asInstanceOf
258-
259- def [T ](arr : IArray [T ]) find(p : T => Boolean ): Option [T ] =
260- arr.asInstanceOf [Array [T ]].find(p).asInstanceOf
261-
262- def [T , U : ClassTag ](arr : IArray [T ]) flatMap(f : T => IterableOnce [U ]): IArray [U ] =
263- arr.asInstanceOf [Array [T ]].flatMap(f).asInstanceOf
264-
265- def [T , U : ClassTag ](arr : IArray [T ]) flatten(given T => Iterable [U ]): IArray [U ] =
266- arr.asInstanceOf [Array [T ]].flatten.asInstanceOf
267-
268- def [T , U >: T : ClassTag ](arr : IArray [T ]) fold(z : U )(op : (U , U ) => U ): U =
269- arr.asInstanceOf [Array [T ]].fold(z)(op).asInstanceOf
270-
271- def [T , U >: T : ClassTag ](arr : IArray [T ]) foldLeft(z : U )(op : (U , T ) => U ): U =
272- arr.asInstanceOf [Array [T ]].foldLeft(z)(op).asInstanceOf
273-
274- def [T , U >: T : ClassTag ](arr : IArray [T ]) foldRight(z : U )(op : (T , U ) => U ): U =
275- arr.asInstanceOf [Array [T ]].foldRight(z)(op).asInstanceOf
276-
277- def [T ](arr : IArray [T ]) forall(p : T => Boolean ): Boolean =
278- arr.asInstanceOf [Array [T ]].forall(p)
279-
280- def [T , U ](arr : IArray [T ]) foreach(f : T => U ): Unit =
281- arr.asInstanceOf [Array [T ]].foreach(f)
282-
283- def [T ](arr : IArray [T ]) head : T =
284- arr.asInstanceOf [Array [T ]].head
285-
286- def [T ](arr : IArray [T ]) headOption : Option [T ] =
287- arr.asInstanceOf [Array [T ]].headOption
288-
289- def [T ](arr : IArray [T ]) indexOf(elem : T , from : Int = 0 ): Int =
290- arr.asInstanceOf [Array [T ]].indexOf(elem, from)
291-
292- def [T ](arr : IArray [T ]) indexWhere(p : T => Boolean , from : Int = 0 ): Int =
293- arr.asInstanceOf [Array [T ]].indexWhere(p, from)
294-
295- def [T ](arr : IArray [T ]) indices : Range =
296- arr.asInstanceOf [Array [T ]].indices.asInstanceOf
297-
298- def [T ](arr : IArray [T ]) init : IArray [T ] =
299- arr.asInstanceOf [Array [T ]].init.asInstanceOf
300-
301- def [T ](arr : IArray [T ]) isEmpty : Boolean =
302- arr.asInstanceOf [Array [T ]].isEmpty
303-
304- def [T ](arr : IArray [T ]) iterator : Iterator [T ] =
305- arr.asInstanceOf [Array [T ]].iterator
306-
307- def [T ](arr : IArray [T ]) last : T =
308- arr.asInstanceOf [Array [T ]].last
309-
310- def [T ](arr : IArray [T ]) lastOption : Option [T ] =
311- arr.asInstanceOf [Array [T ]].lastOption
312-
313- def [T ](arr : IArray [T ]) lastIndexOf(elem : T , from : Int = 0 ): Int =
314- arr.asInstanceOf [Array [T ]].lastIndexOf(elem, from)
315-
316- def [T ](arr : IArray [T ]) lastIndexWhere(p : T => Boolean , from : Int = 0 ): Int =
317- arr.asInstanceOf [Array [T ]].lastIndexWhere(p, from)
318-
319- def [T , U : ClassTag ](arr : IArray [T ]) map(f : T => U ): IArray [U ] =
320- arr.asInstanceOf [Array [T ]].map(f).asInstanceOf
321-
322- def [T ](arr : IArray [T ]) nonEmpty : Boolean =
323- arr.asInstanceOf [Array [T ]].nonEmpty
324-
325- def [T ](arr : IArray [T ]) partition(p : T => Boolean ): (IArray [T ], IArray [T ]) =
326- arr.asInstanceOf [Array [T ]].partition(p) match {
327- case (x, y) => (x.asInstanceOf [IArray [T ]], y.asInstanceOf [IArray [T ]])
328- }
329-
330- def [T ](arr : IArray [T ]) reverse : IArray [T ] =
331- arr.asInstanceOf [Array [T ]].reverse.asInstanceOf
332-
333- def [T , U >: T : ClassTag ](arr : IArray [T ]) scan(z : U )(op : (U , U ) => U ): Array [U ] =
334- arr.asInstanceOf [Array [T ]].scan(z)(op).asInstanceOf
335-
336- def [T , U : ClassTag ](arr : IArray [T ]) scanLeft(z : U )(op : (U , T ) => U ): Array [U ] =
337- arr.asInstanceOf [Array [T ]].scanLeft(z)(op).asInstanceOf
338-
339- def [T , U : ClassTag ](arr : IArray [T ]) scanRight(z : U )(op : (T , U ) => U ): Array [U ] =
340- arr.asInstanceOf [Array [T ]].scanRight(z)(op).asInstanceOf
341-
342- def [T ](arr : IArray [T ]) size : Int =
343- arr.asInstanceOf [Array [T ]].size
344-
345- def [T ](arr : IArray [T ]) slice(from : Int , until : Int ): Array [T ] =
346- arr.asInstanceOf [Array [T ]].slice(from, until).asInstanceOf
347-
348- def [T , U : ClassTag ](arr : IArray [T ]) sortBy(f : T => U )(given math .Ordering [U ]): IArray [T ] =
349- arr.asInstanceOf [Array [T ]].sortBy(f).asInstanceOf
350-
351- def [T ](arr : IArray [T ]) sortWith(f : (T , T ) => Boolean ): IArray [T ] =
352- arr.asInstanceOf [Array [T ]].sortWith(f).asInstanceOf
353-
354- def [T ](arr : IArray [T ]) sorted(given math .Ordering [T ]): IArray [T ] =
355- arr.asInstanceOf [Array [T ]].sorted.asInstanceOf
356-
357- def [T ](arr : IArray [T ]) span(p : T => Boolean ): (IArray [T ], IArray [T ]) =
358- arr.asInstanceOf [Array [T ]].span(p) match {
359- case (x, y) => (x.asInstanceOf [IArray [T ]], y.asInstanceOf [IArray [T ]])
360- }
361-
362- def [T ](arr : IArray [T ]) splitAt(n : Int ): (IArray [T ], IArray [T ]) =
363- arr.asInstanceOf [Array [T ]].splitAt(n) match {
364- case (x, y) => (x.asInstanceOf [IArray [T ]], y.asInstanceOf [IArray [T ]])
365- }
366-
367- def [T , U >: T : ClassTag ](arr : IArray [T ]) startsWith(that : IArray [U ], offset : Int = 0 ): Boolean =
368- arr.asInstanceOf [Array [T ]].startsWith(that.asInstanceOf [Array [U ]])
369-
370- def [T ](arr : IArray [T ]) tail : IArray [T ] =
371- arr.asInstanceOf [Array [T ]].tail.asInstanceOf
372-
373- def [T ](arr : IArray [T ]) take(n : Int ): IArray [T ] =
374- arr.asInstanceOf [Array [T ]].take(n).asInstanceOf
375-
376- def [T ](arr : IArray [T ]) takeRight(n : Int ): IArray [T ] =
377- arr.asInstanceOf [Array [T ]].takeRight(n).asInstanceOf
378-
379- def [T ](arr : IArray [T ]) takeWhile(p : T => Boolean ): IArray [T ] =
380- arr.asInstanceOf [Array [T ]].takeWhile(p).asInstanceOf
381-
382- def [T , U : ClassTag , V : ClassTag ](arr : IArray [T ]) unzip(given T => (U , V )): (IArray [U ], IArray [V ]) =
383- arr.asInstanceOf [Array [T ]].unzip match {
384- case (x, y) => (x.asInstanceOf [IArray [U ]], y.asInstanceOf [IArray [V ]])
385- }
386-
387- def [T , U : ClassTag ](arr : IArray [T ]) zip(that : IterableOnce [U ]): IArray [(T , U )] =
388- arr.asInstanceOf [Array [T ]].zip(that).asInstanceOf
389- }
390386}
0 commit comments