Skip to content

Commit 7444d02

Browse files
author
Antoine Brunner
committed
Move extension methods to IArray class
1 parent a9ba00e commit 7444d02

File tree

2 files changed

+161
-157
lines changed

2 files changed

+161
-157
lines changed

library/src-bootstrapped/scala/IArray.scala

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

library/src/scala/runtime/DynamicTuple.scala

Lines changed: 0 additions & 157 deletions
Original file line numberDiff line numberDiff line change
@@ -5,163 +5,6 @@ import scala.reflect.ClassTag
55

66
object DynamicTuple {
77

8-
given iarrayOps: [T](arr: IArray[T]) {
9-
def ++[U >: T: ClassTag](that: IArray[U]): IArray[U] =
10-
(arr.asInstanceOf[Array[T]] ++ that.asInstanceOf[Array[U]]).asInstanceOf
11-
12-
def contains(elem: T): Boolean =
13-
arr.asInstanceOf[Array[T]].contains(elem)
14-
15-
def count(p: T => Boolean): Int =
16-
arr.asInstanceOf[Array[T]].count(p)
17-
18-
def drop(n: Int): IArray[T] =
19-
arr.asInstanceOf[Array[T]].drop(n).asInstanceOf
20-
21-
def dropRight(n: Int): IArray[T] =
22-
arr.asInstanceOf[Array[T]].dropRight(n).asInstanceOf
23-
24-
def dropWhile(p: T => Boolean): IArray[T] =
25-
arr.asInstanceOf[Array[T]].dropWhile(p).asInstanceOf
26-
27-
def exists(p: T => Boolean): IArray[T] =
28-
arr.asInstanceOf[Array[T]].exists(p).asInstanceOf
29-
30-
def filter(p: T => Boolean): IArray[T] =
31-
arr.asInstanceOf[Array[T]].filter(p).asInstanceOf
32-
33-
def filterNot(p: T => Boolean): IArray[T] =
34-
arr.asInstanceOf[Array[T]].filterNot(p).asInstanceOf
35-
36-
def find(p: T => Boolean): Option[T] =
37-
arr.asInstanceOf[Array[T]].find(p).asInstanceOf
38-
39-
def flatMap[U: ClassTag](f: T => IterableOnce[U]): IArray[U] =
40-
arr.asInstanceOf[Array[T]].flatMap(f).asInstanceOf
41-
42-
def flatten[U: ClassTag](given T => Iterable[U]): IArray[U] =
43-
arr.asInstanceOf[Array[T]].flatten.asInstanceOf
44-
45-
def fold[U >: T: ClassTag](z: U)(op: (U, U) => U): U =
46-
arr.asInstanceOf[Array[T]].fold(z)(op).asInstanceOf
47-
48-
def foldLeft[U >: T: ClassTag](z: U)(op: (U, T) => U): U =
49-
arr.asInstanceOf[Array[T]].foldLeft(z)(op).asInstanceOf
50-
51-
def foldRight[U >: T: ClassTag](z: U)(op: (T, U) => U): U =
52-
arr.asInstanceOf[Array[T]].foldRight(z)(op).asInstanceOf
53-
54-
def forall(p: T => Boolean): Boolean =
55-
arr.asInstanceOf[Array[T]].forall(p)
56-
57-
def foreach[U](f: T => U): Unit =
58-
arr.asInstanceOf[Array[T]].foreach(f)
59-
60-
def head: T =
61-
arr.asInstanceOf[Array[T]].head
62-
63-
def headOption: Option[T] =
64-
arr.asInstanceOf[Array[T]].headOption
65-
66-
def indexOf(elem: T, from: Int = 0): Int =
67-
arr.asInstanceOf[Array[T]].indexOf(elem, from)
68-
69-
def indexWhere(p: T => Boolean, from: Int = 0): Int =
70-
arr.asInstanceOf[Array[T]].indexWhere(p, from)
71-
72-
def indices: Range =
73-
arr.asInstanceOf[Array[T]].indices.asInstanceOf
74-
75-
def init: IArray[T] =
76-
arr.asInstanceOf[Array[T]].init.asInstanceOf
77-
78-
def isEmpty: Boolean =
79-
arr.asInstanceOf[Array[T]].isEmpty
80-
81-
def iterator: Iterator[T] =
82-
arr.asInstanceOf[Array[T]].iterator
83-
84-
def last: T =
85-
arr.asInstanceOf[Array[T]].last
86-
87-
def lastOption: Option[T] =
88-
arr.asInstanceOf[Array[T]].lastOption
89-
90-
def lastIndexOf(elem: T, from: Int = 0): Int =
91-
arr.asInstanceOf[Array[T]].lastIndexOf(elem, from)
92-
93-
def lastIndexWhere(p: T => Boolean, from: Int = 0): Int =
94-
arr.asInstanceOf[Array[T]].lastIndexWhere(p, from)
95-
96-
def map[U: ClassTag](f: T => U): IArray[U] =
97-
arr.asInstanceOf[Array[T]].map(f).asInstanceOf
98-
99-
def nonEmpty: Boolean =
100-
arr.asInstanceOf[Array[T]].nonEmpty
101-
102-
def partition(p: T => Boolean): (IArray[T], IArray[T]) = arr.asInstanceOf[Array[T]].partition(p) match {
103-
case (x, y) => (x.asInstanceOf[IArray[T]], y.asInstanceOf[IArray[T]])
104-
}
105-
106-
def reverse: IArray[T] =
107-
arr.asInstanceOf[Array[T]].reverse.asInstanceOf
108-
109-
def scan[U >: T: ClassTag](z: U)(op: (U, U) => U): Array[U] =
110-
arr.asInstanceOf[Array[T]].scan(z)(op).asInstanceOf
111-
112-
def scanLeft[U: ClassTag](z: U)(op: (U, T) => U): Array[U] =
113-
arr.asInstanceOf[Array[T]].scanLeft(z)(op).asInstanceOf
114-
115-
def scanRight[U: ClassTag](z: U)(op: (T, U) => U): Array[U] =
116-
arr.asInstanceOf[Array[T]].scanRight(z)(op).asInstanceOf
117-
118-
def size: Int =
119-
arr.asInstanceOf[Array[T]].size
120-
121-
def slice(from: Int, until: Int): Array[T] =
122-
arr.asInstanceOf[Array[T]].slice(from, until).asInstanceOf
123-
124-
def sortBy[U: ClassTag](f: T => U)(given math.Ordering[U]): IArray[T] =
125-
arr.asInstanceOf[Array[T]].sortBy(f).asInstanceOf
126-
127-
def sortWith(f: (T, T) => Boolean): IArray[T] =
128-
arr.asInstanceOf[Array[T]].sortWith(f).asInstanceOf
129-
130-
def sorted(given math.Ordering[T]): IArray[T] =
131-
arr.asInstanceOf[Array[T]].sorted.asInstanceOf
132-
133-
def span(p: T => Boolean): (IArray[T], IArray[T]) = arr.asInstanceOf[Array[T]].span(p) match {
134-
case (x, y) => (x.asInstanceOf[IArray[T]], y.asInstanceOf[IArray[T]])
135-
}
136-
137-
def splitAt(n: Int): (IArray[T], IArray[T]) = arr.asInstanceOf[Array[T]].splitAt(n) match {
138-
case (x, y) => (x.asInstanceOf[IArray[T]], y.asInstanceOf[IArray[T]])
139-
}
140-
141-
def startsWith[U >: T: ClassTag](that: IArray[U], offset: Int = 0): Boolean =
142-
arr.asInstanceOf[Array[T]].startsWith(that.asInstanceOf[Array[U]])
143-
144-
def tail: IArray[T] =
145-
arr.asInstanceOf[Array[T]].tail.asInstanceOf
146-
147-
def take(n: Int): IArray[T] =
148-
arr.asInstanceOf[Array[T]].take(n).asInstanceOf
149-
150-
def takeRight(n: Int): IArray[T] =
151-
arr.asInstanceOf[Array[T]].takeRight(n).asInstanceOf
152-
153-
def takeWhile(p: T => Boolean): IArray[T] =
154-
arr.asInstanceOf[Array[T]].takeWhile(p).asInstanceOf
155-
156-
def unzip[U: ClassTag, V: ClassTag](given T => (U, V)): (IArray[U], IArray[V]) =
157-
arr.asInstanceOf[Array[T]].unzip(asPair, ct1, ct2) match {
158-
case (x, y) => (x.asInstanceOf[IArray[U]], y.asInstanceOf[IArray[V]])
159-
}
160-
161-
def zip[U: ClassTag](that: IterableOnce[U]): IArray[(T, U)] =
162-
arr.asInstanceOf[Array[T]].zip(that).asInstanceOf
163-
}
164-
1658
inline val MaxSpecialized = 22
1669
inline private val XXL = MaxSpecialized + 1
16710

0 commit comments

Comments
 (0)