[arraydeque] scala 2.13 collections - lightbend · new collection in scala 2.13 also known as...
TRANSCRIPT
![Page 1: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/1.jpg)
[ARRAYDEQUE][ARRAYDEQUE]Scala 2.13 Collections
* https://english.stackexchange.com/questions/226954/how-is-deque-commonly-pronounced
![Page 2: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/2.jpg)
ABOUT MEABOUT MEPathikrit Bhowmick
Scala for 5 years
❤
github.com/pathikrit
Coatue Management
Data structures FP
![Page 3: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/3.jpg)
SCALA 2.13 COLLECTIONSSCALA 2.13 COLLECTIONS
https://www.scala-lang.org/blog/2018/06/13/scala-213-collections.html
![Page 4: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/4.jpg)
![Page 5: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/5.jpg)
![Page 6: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/6.jpg)
CANBUILDFROMCANBUILDFROMdef map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That
https://www.scala-lang.org/blog/2017/05/30/tribulations-canbuildfrom.html
![Page 7: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/7.jpg)
CANBUILDFROMCANBUILDFROMdef map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That
trait IterableOps[A, CC[_]] { def map[B](f: A => B): CC[B] }
https://www.scala-lang.org/blog/2017/05/30/tribulations-canbuildfrom.html
![Page 8: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/8.jpg)
NEW APISNEW APIS
![Page 9: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/9.jpg)
NEW APISNEW APISdef namesByAge(users: Seq[User]): Map[Int, Seq[String]] = users.groupBy(_.age).mapValues(users => users.map(_.name))
![Page 10: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/10.jpg)
NEW APISNEW APISdef namesByAge(users: Seq[User]): Map[Int, Seq[String]] = users.groupBy(_.age).mapValues(users => users.map(_.name))
def namesByAge(users: Seq[User]): Map[Int, Seq[String]] = users.groupMap(_.age)(_.name)
![Page 11: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/11.jpg)
IN PLACE MUTABLE APIIN PLACE MUTABLE API
![Page 12: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/12.jpg)
IN PLACE MUTABLE APIIN PLACE MUTABLE APIval users: mutable.ArrayBuffer[User] = ??? users .filterInPlace(user => !user.name.startsWith("J")) .mapInPlace(user => user.copy(age = user.age + 1))
![Page 13: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/13.jpg)
MOREMOREStream vs LazyListBetter ViewsIterable vs. Traversable/IteratorNew collections
![Page 14: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/14.jpg)
ARRAYDEQUEARRAYDEQUE
![Page 15: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/15.jpg)
ARRAYDEQUEARRAYDEQUENew collection in Scala 2.13Also known as CircularBuffer
![Page 16: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/16.jpg)
ARRAYDEQUEARRAYDEQUENew collection in Scala 2.13Also known as CircularBufferReplacement for most mutable collectionsFaster than ArrayBuffer when used as an arrayFaster than LinkedList when used as a linked list
![Page 17: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/17.jpg)
ARRAYDEQUEARRAYDEQUENew collection in Scala 2.13Also known as CircularBufferReplacement for most mutable collectionsFaster than ArrayBuffer when used as an arrayFaster than LinkedList when used as a linked listMy first contribution to Scala!
![Page 18: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/18.jpg)
DATA STRUCTURES 101DATA STRUCTURES 101Data Structures get(idx) update(idx, e) append(e) prepend(e) deleteFirst() deleteLast() insertAt(idx, e) deleteAt(idx)
mutable.ArrayDeque O(1) O(1) O(1) O(1) O(1) O(1) O(min(i, n-i)) O(min(i, n-i))
mutable.ArrayBuffer O(1) O(1) O(1) O(n) O(n) O(1) O(n) O(n)
mutable.Stack O(n) O(n) O(1) (push) O(n) O(n) O(1) (pop) O(n) O(n)
mutable.Queue O(n) O(n) O(1) (enque) O(n) O(1) (deque) O(n) O(n) O(n)
mutable.LinkedList O(n) O(n) O(1) O(1) O(1) O(1) O(n) O(n)
java.util.ArrayList O(1) O(1) O(1) O(n) O(n) O(1) O(n) O(n)
java.util.ArrayDeque N/A O(1) O(1) O(1) O(1) O(1) O(n) O(n)
![Page 19: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/19.jpg)
ARRAYARRAY DDOUBLYOUBLYEENDEDNDEDQUEQUEUEUE
![Page 20: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/20.jpg)
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) }
ARRAYARRAY DDOUBLYOUBLYEENDEDNDEDQUEQUEUEUE
![Page 21: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/21.jpg)
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) }
ARRAYARRAY DDOUBLYOUBLYEENDEDNDEDQUEQUEUEUE
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } }
![Page 22: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/22.jpg)
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) }
ARRAYARRAY DDOUBLYOUBLYEENDEDNDEDQUEQUEUEUE
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } }
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } def prepend(a: A): Unit = { start = (start - 1)%n array(start) = a } }
![Page 23: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/23.jpg)
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) }
ARRAYARRAY DDOUBLYOUBLYEENDEDNDEDQUEQUEUEUE
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } }
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } def prepend(a: A): Unit = { start = (start - 1)%n array(start) = a } }
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } def prepend(a: A): Unit = { start = (start - 1)%n array(start) = a } def deleteLast(): Unit = end = (end - 1)%n }
![Page 24: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/24.jpg)
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) }
ARRAYARRAY DDOUBLYOUBLYEENDEDNDEDQUEQUEUEUE
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } }
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } def prepend(a: A): Unit = { start = (start - 1)%n array(start) = a } }
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } def prepend(a: A): Unit = { start = (start - 1)%n array(start) = a } def deleteLast(): Unit = end = (end - 1)%n }
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } def prepend(a: A): Unit = { start = (start - 1)%n array(start) = a } def deleteLast(): Unit = end = (end - 1)%n def deleteFirst(): Unit = start = (start + 1)%n }
![Page 25: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/25.jpg)
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) }
ARRAYARRAY DDOUBLYOUBLYEENDEDNDEDQUEQUEUEUE
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } }
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } def prepend(a: A): Unit = { start = (start - 1)%n array(start) = a } }
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } def prepend(a: A): Unit = { start = (start - 1)%n array(start) = a } def deleteLast(): Unit = end = (end - 1)%n }
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } def prepend(a: A): Unit = { start = (start - 1)%n array(start) = a } def deleteLast(): Unit = end = (end - 1)%n def deleteFirst(): Unit = start = (start + 1)%n }
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } def prepend(a: A): Unit = { start = (start - 1)%n array(start) = a } def deleteLast(): Unit = end = (end - 1)%n def deleteFirst(): Unit = start = (start + 1)%n def clear(): Unit = start = end }
![Page 26: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/26.jpg)
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) }
ARRAYARRAY DDOUBLYOUBLYEENDEDNDEDQUEQUEUEUE
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } }
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } def prepend(a: A): Unit = { start = (start - 1)%n array(start) = a } }
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } def prepend(a: A): Unit = { start = (start - 1)%n array(start) = a } def deleteLast(): Unit = end = (end - 1)%n }
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } def prepend(a: A): Unit = { start = (start - 1)%n array(start) = a } def deleteLast(): Unit = end = (end - 1)%n def deleteFirst(): Unit = start = (start + 1)%n }
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } def prepend(a: A): Unit = { start = (start - 1)%n array(start) = a } def deleteLast(): Unit = end = (end - 1)%n def deleteFirst(): Unit = start = (start + 1)%n def clear(): Unit = start = end }
class ArrayDeque[A] { val n = 64 val array = Array.ofDim[A](n) var start, end = 0 def update(i: Int, a: A): Unit = array((start + i)%n) = a def apply(i: Int): A = array((start + i)%n) def append(a: A): Unit = { array(end) = a end = (end + 1)%n } def prepend(a: A): Unit = { start = (start - 1)%n array(start) = a } def deleteLast(): Unit = end = (end - 1)%n def deleteFirst(): Unit = start = (start + 1)%n def clear(): Unit = start = end def size: Int = (end - start)%n }
![Page 27: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/27.jpg)
DEMODEMO
![Page 28: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/28.jpg)
SCALA 2.13SCALA 2.13scala.collection.mutable.ArrayDeque
![Page 29: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/29.jpg)
PERFORMACEPERFORMACE
![Page 30: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/30.jpg)
PERFORMACEPERFORMACEArray.copy (memcpy)
insertAt(idx), deleteAt(idx), remove(idx)clone()slice()Pre-emptive allocations:
insertAll(), prependAll()
![Page 31: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/31.jpg)
PERFORMACEPERFORMACEArray.copy (memcpy)
insertAt(idx), deleteAt(idx), remove(idx)clone()slice()Pre-emptive allocations:
insertAll(), prependAll()
Bit hack if n (array.length) = 2^k
i%n == i&(n 1)
![Page 32: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/32.jpg)
BENCHMARKSBENCHMARKSOperation ArrayBuffer ArrayDeque Speedup
Insert lots of items 2473.36 ms 956.76 ms 2.5x
Drop some items from an head index 7.65 ms 1.25 ms 5x
Drop some items from a tail index 2.54 ms 0.28 ms 10x
Append lots of items one by one 3576.63 ms 2222.13 ms 1.5x
Prepend few items one by one 8699.13 ms 1.33 ms O(n)
Prepend lots of items at once 2124.02 ms 462.76 ms 5x
Random indexing 81.62 ms 84.02 ms -
Insert items near head 2980.46 ms 1429.52 ms 2x
Reversal 491.46 ms 378.69 ms 1.5x
Insert items near tail 8588.98 ms 2504.20 ms 3x
Sliding 1591.47 ms 157.25 ms 10x
toArray 194.55 ms 181.07 ms -
Clear lots of items 48.34 ms 28.62 ms 2x
![Page 34: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/34.jpg)
GITHUB.COM/STANCH/REFTREEGITHUB.COM/STANCH/REFTREEimport reftree.core._ import reftree.render._ import reftree.diagram._ import reftree.util.Reflection._ implicit def renderArrayDeque: ToRefTree[ArrayDeque[Char]] = ToRefTree {ds => val array = ds.privateField[Array[AnyRef]]("array") val start = ds.privateField[Int]("start") val end = ds.privateField[Int]("end") val arrayRef = { val arrayFields = array.zipWithIndex map { case (a, i) => val fieldName = { var s = i.toString if (i == start) s = '↳' + s if (i == end) s = s + '↲' s } val refTree = Option(a) match { case Some(c) => RefTree.Val(c.asInstanceOf[Char]).withHighlight(true) case None => RefTree.Null().withHighlight(i == end) } refTree.toField.withName(fieldName) } RefTree.Ref(array, arrayFields).rename(s"char[${array.length}]") } RefTree.Ref(ds, Seq( start.refTree.withHighlight(true).toField.withName("start"), end.refTree.withHighlight(true).toField.withName("end"), arrayRef.toField.withName("array") ) ++ ds.toArray.zipWithIndex.map({case (a, i) => a.refTree.toField.withName(i.toString)})) }
![Page 35: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/35.jpg)
TAKE AWAYSTAKE AWAYS
Please contribute
![Page 36: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/36.jpg)
TAKE AWAYSTAKE AWAYS
Please contribute
Contributing to Scala is not scary
![Page 37: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/37.jpg)
TAKE AWAYSTAKE AWAYSArrayDeques are coolPlease contribute
Contributing to Scala is not scaryData structures > AlgorithmsRope, SkipList, Zipper, Heap
![Page 38: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/38.jpg)
TAKE AWAYSTAKE AWAYSArrayDeques are coolPlease contribute
Contributing to Scala is not scaryData structures > AlgorithmsRope, SkipList, Zipper, Heap
Visualize your data structures
![Page 39: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/39.jpg)
TAKE AWAYSTAKE AWAYSArrayDeques are coolPlease contribute
Contributing to Scala is not scaryData structures > AlgorithmsRope, SkipList, Zipper, Heap
Visualize your data structuresScala 2.13 awaits!
![Page 41: [ARRAYDEQUE] Scala 2.13 Collections - Lightbend · New collection in Scala 2.13 Also known as CircularBuffer Replacement for most mutable collections Faster than ArrayBuffer when](https://reader030.vdocuments.net/reader030/viewer/2022041016/5ec820facc5ac87ea05efef4/html5/thumbnails/41.jpg)
WE ARE HIRINGWE ARE HIRINGWho we are:
What we do:
Quant TradingData ScienceNLP
What we love:
Functional ProgrammingAlgorithmsStatisticsData
Coatue Management
Tech stack:
ScalaSparkPostgreSQLTableauRPythonDockerAWS
Where are we:
NYCSF