Skip to content

Commit

Permalink
Support backstack read operations from a background thread
Browse files Browse the repository at this point in the history
  • Loading branch information
Kritarie committed Oct 30, 2023
1 parent b4b1e43 commit 412c2a8
Show file tree
Hide file tree
Showing 3 changed files with 404 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
package com.wealthfront.magellan.navigation

import java.util.Deque
import java.util.concurrent.CopyOnWriteArrayList

internal class CopyOnWriteArrayDeque<E> : Deque<E> {

private val list = CopyOnWriteArrayList<E>()

override fun add(element: E): Boolean {
return list.add(element)
}

override fun addAll(elements: Collection<E>): Boolean {
return list.addAll(elements)
}

override fun clear() {
list.clear()
}

override fun iterator(): MutableIterator<E> {
return list.iterator()
}

override fun remove(): E {
return list.removeFirst()
}

override fun remove(element: E?): Boolean {
return list.remove(element)
}

override fun removeAll(elements: Collection<E>): Boolean {
return list.removeAll(elements.toSet())
}

override fun retainAll(elements: Collection<E>): Boolean {
return list.retainAll(elements.toSet())
}

override fun contains(element: E?): Boolean {
return list.contains(element)
}

override fun containsAll(elements: Collection<E>): Boolean {
return list.containsAll(elements)
}

override fun isEmpty(): Boolean {
return list.isEmpty()
}

override fun offer(e: E): Boolean {
return list.add(e)
}

override fun poll(): E? {
return list.removeFirstOrNull()
}

override fun element(): E {
return list.first()
}

override fun peek(): E? {
return list.firstOrNull()
}

override fun addFirst(e: E) {
list.add(0, e)
}

override fun addLast(e: E) {
add(e)
}

override fun offerFirst(e: E): Boolean {
list.add(0, e)
return true
}

override fun offerLast(e: E): Boolean {
return list.add(e)
}

override fun removeFirst(): E {
return list.removeFirst()
}

override fun removeLast(): E {
return list.removeLast()
}

override fun pollFirst(): E? {
return list.removeFirstOrNull()
}

override fun pollLast(): E? {
return list.removeLastOrNull()
}

override fun getFirst(): E {
return list.first()
}

override fun getLast(): E {
return list.last()
}

override fun peekFirst(): E? {
return list.firstOrNull()
}

override fun peekLast(): E? {
return list.lastOrNull()
}

override fun removeFirstOccurrence(o: Any?): Boolean {
return list.remove(o)
}

override fun removeLastOccurrence(o: Any?): Boolean {
val lastIndex = list.lastIndexOf(o)
return if (lastIndex >= 0) {
list.removeAt(lastIndex)
true
} else {
false
}
}

override fun push(e: E) {
addFirst(e)
}

override fun pop(): E {
return removeFirst()
}

override fun descendingIterator(): MutableIterator<E> {
throw NotImplementedError("descendingIterator() is not supported.")
}

override val size: Int
get() = list.size
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public open class NavigationDelegate(

protected var containerView: ScreenContainer? = null
protected val navigationPropagator: NavigationPropagator = NavigationPropagator
public val backStack: Deque<NavigationEvent> = ArrayDeque()
public val backStack: Deque<NavigationEvent> = CopyOnWriteArrayDeque()

protected val Deque<NavigationEvent>.currentNavigable: NavigableCompat?
get() {
Expand Down

0 comments on commit 412c2a8

Please sign in to comment.