@@ -223,4 +223,165 @@ object IArray {
223223 * @return sequence wrapped in a [[scala.Some ]], if `x` is a Seq, otherwise `None`
224224 */
225225 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 : [T ](arr : IArray [T ]) {
232+ def ++ [U >: T : ClassTag ](that : IArray [U ]): IArray [U ] =
233+ (arr.asInstanceOf [Array [T ]] ++ that.asInstanceOf [Array [U ]]).asInstanceOf
234+
235+ def contains (elem : T ): Boolean =
236+ arr.asInstanceOf [Array [T ]].contains(elem)
237+
238+ def count (p : T => Boolean ): Int =
239+ arr.asInstanceOf [Array [T ]].count(p)
240+
241+ def drop (n : Int ): IArray [T ] =
242+ arr.asInstanceOf [Array [T ]].drop(n).asInstanceOf
243+
244+ def dropRight (n : Int ): IArray [T ] =
245+ arr.asInstanceOf [Array [T ]].dropRight(n).asInstanceOf
246+
247+ def dropWhile (p : T => Boolean ): IArray [T ] =
248+ arr.asInstanceOf [Array [T ]].dropWhile(p).asInstanceOf
249+
250+ def exists (p : T => Boolean ): IArray [T ] =
251+ arr.asInstanceOf [Array [T ]].exists(p).asInstanceOf
252+
253+ def filter (p : T => Boolean ): IArray [T ] =
254+ arr.asInstanceOf [Array [T ]].filter(p).asInstanceOf
255+
256+ def filterNot (p : T => Boolean ): IArray [T ] =
257+ arr.asInstanceOf [Array [T ]].filterNot(p).asInstanceOf
258+
259+ def find (p : T => Boolean ): Option [T ] =
260+ arr.asInstanceOf [Array [T ]].find(p).asInstanceOf
261+
262+ def flatMap [U : ClassTag ](f : T => IterableOnce [U ]): IArray [U ] =
263+ arr.asInstanceOf [Array [T ]].flatMap(f).asInstanceOf
264+
265+ def flatten [U : ClassTag ](given T => Iterable [U ]): IArray [U ] =
266+ arr.asInstanceOf [Array [T ]].flatten.asInstanceOf
267+
268+ def fold [U >: T : ClassTag ](z : U )(op : (U , U ) => U ): U =
269+ arr.asInstanceOf [Array [T ]].fold(z)(op).asInstanceOf
270+
271+ def foldLeft [U >: T : ClassTag ](z : U )(op : (U , T ) => U ): U =
272+ arr.asInstanceOf [Array [T ]].foldLeft(z)(op).asInstanceOf
273+
274+ def foldRight [U >: T : ClassTag ](z : U )(op : (T , U ) => U ): U =
275+ arr.asInstanceOf [Array [T ]].foldRight(z)(op).asInstanceOf
276+
277+ def forall (p : T => Boolean ): Boolean =
278+ arr.asInstanceOf [Array [T ]].forall(p)
279+
280+ def foreach [U ](f : T => U ): Unit =
281+ arr.asInstanceOf [Array [T ]].foreach(f)
282+
283+ def head : T =
284+ arr.asInstanceOf [Array [T ]].head
285+
286+ def headOption : Option [T ] =
287+ arr.asInstanceOf [Array [T ]].headOption
288+
289+ def indexOf (elem : T , from : Int = 0 ): Int =
290+ arr.asInstanceOf [Array [T ]].indexOf(elem, from)
291+
292+ def indexWhere (p : T => Boolean , from : Int = 0 ): Int =
293+ arr.asInstanceOf [Array [T ]].indexWhere(p, from)
294+
295+ def indices : Range =
296+ arr.asInstanceOf [Array [T ]].indices.asInstanceOf
297+
298+ def init : IArray [T ] =
299+ arr.asInstanceOf [Array [T ]].init.asInstanceOf
300+
301+ def isEmpty : Boolean =
302+ arr.asInstanceOf [Array [T ]].isEmpty
303+
304+ def iterator : Iterator [T ] =
305+ arr.asInstanceOf [Array [T ]].iterator
306+
307+ def last : T =
308+ arr.asInstanceOf [Array [T ]].last
309+
310+ def lastOption : Option [T ] =
311+ arr.asInstanceOf [Array [T ]].lastOption
312+
313+ def lastIndexOf (elem : T , from : Int = 0 ): Int =
314+ arr.asInstanceOf [Array [T ]].lastIndexOf(elem, from)
315+
316+ def lastIndexWhere (p : T => Boolean , from : Int = 0 ): Int =
317+ arr.asInstanceOf [Array [T ]].lastIndexWhere(p, from)
318+
319+ def map [U : ClassTag ](f : T => U ): IArray [U ] =
320+ arr.asInstanceOf [Array [T ]].map(f).asInstanceOf
321+
322+ def nonEmpty : Boolean =
323+ arr.asInstanceOf [Array [T ]].nonEmpty
324+
325+ def partition (p : T => Boolean ): (IArray [T ], IArray [T ]) = arr.asInstanceOf [Array [T ]].partition(p) match {
326+ case (x, y) => (x.asInstanceOf [IArray [T ]], y.asInstanceOf [IArray [T ]])
327+ }
328+
329+ def reverse : IArray [T ] =
330+ arr.asInstanceOf [Array [T ]].reverse.asInstanceOf
331+
332+ def scan [U >: T : ClassTag ](z : U )(op : (U , U ) => U ): Array [U ] =
333+ arr.asInstanceOf [Array [T ]].scan(z)(op).asInstanceOf
334+
335+ def scanLeft [U : ClassTag ](z : U )(op : (U , T ) => U ): Array [U ] =
336+ arr.asInstanceOf [Array [T ]].scanLeft(z)(op).asInstanceOf
337+
338+ def scanRight [U : ClassTag ](z : U )(op : (T , U ) => U ): Array [U ] =
339+ arr.asInstanceOf [Array [T ]].scanRight(z)(op).asInstanceOf
340+
341+ def size : Int =
342+ arr.asInstanceOf [Array [T ]].size
343+
344+ def slice (from : Int , until : Int ): Array [T ] =
345+ arr.asInstanceOf [Array [T ]].slice(from, until).asInstanceOf
346+
347+ def sortBy [U : ClassTag ](f : T => U )(given math .Ordering [U ]): IArray [T ] =
348+ arr.asInstanceOf [Array [T ]].sortBy(f).asInstanceOf
349+
350+ def sortWith (f : (T , T ) => Boolean ): IArray [T ] =
351+ arr.asInstanceOf [Array [T ]].sortWith(f).asInstanceOf
352+
353+ def sorted (given math .Ordering [T ]): IArray [T ] =
354+ arr.asInstanceOf [Array [T ]].sorted.asInstanceOf
355+
356+ def span (p : T => Boolean ): (IArray [T ], IArray [T ]) = arr.asInstanceOf [Array [T ]].span(p) match {
357+ case (x, y) => (x.asInstanceOf [IArray [T ]], y.asInstanceOf [IArray [T ]])
358+ }
359+
360+ def splitAt (n : Int ): (IArray [T ], IArray [T ]) = arr.asInstanceOf [Array [T ]].splitAt(n) match {
361+ case (x, y) => (x.asInstanceOf [IArray [T ]], y.asInstanceOf [IArray [T ]])
362+ }
363+
364+ def startsWith [U >: T : ClassTag ](that : IArray [U ], offset : Int = 0 ): Boolean =
365+ arr.asInstanceOf [Array [T ]].startsWith(that.asInstanceOf [Array [U ]])
366+
367+ def tail : IArray [T ] =
368+ arr.asInstanceOf [Array [T ]].tail.asInstanceOf
369+
370+ def take (n : Int ): IArray [T ] =
371+ arr.asInstanceOf [Array [T ]].take(n).asInstanceOf
372+
373+ def takeRight (n : Int ): IArray [T ] =
374+ arr.asInstanceOf [Array [T ]].takeRight(n).asInstanceOf
375+
376+ def takeWhile (p : T => Boolean ): IArray [T ] =
377+ arr.asInstanceOf [Array [T ]].takeWhile(p).asInstanceOf
378+
379+ def unzip [U : ClassTag , V : ClassTag ](given T => (U , V )): (IArray [U ], IArray [V ]) =
380+ arr.asInstanceOf [Array [T ]].unzip(asPair, ct1, ct2) match {
381+ case (x, y) => (x.asInstanceOf [IArray [U ]], y.asInstanceOf [IArray [V ]])
382+ }
383+
384+ def zip [U : ClassTag ](that : IterableOnce [U ]): IArray [(T , U )] =
385+ arr.asInstanceOf [Array [T ]].zip(that).asInstanceOf
386+ }
226387}
0 commit comments