aboutsummaryrefslogtreecommitdiffstats
path: root/web/src/js/ducks/utils/view.js
diff options
context:
space:
mode:
Diffstat (limited to 'web/src/js/ducks/utils/view.js')
-rw-r--r--web/src/js/ducks/utils/view.js77
1 files changed, 58 insertions, 19 deletions
diff --git a/web/src/js/ducks/utils/view.js b/web/src/js/ducks/utils/view.js
index 55fdf6c7..5535ed83 100644
--- a/web/src/js/ducks/utils/view.js
+++ b/web/src/js/ducks/utils/view.js
@@ -15,13 +15,15 @@ const makeCompareFn = sortFn => {
return 0
}
}
- if (sortFn.reverse)
- return (a, b) => compareFn(b, a)
+ // need to adjust sortedIndexOf as well
+ // if (sortFn.reverse)
+ // return (a, b) => compareFn(b, a)
return compareFn
}
const sortedInsert = (list, sortFn, item) => {
let l = [...list, item]
+ l.indexOf = x => sortedIndexOf(l, x, sortFn)
let compareFn = makeCompareFn(sortFn)
// only sort if sorting order is not correct yet
@@ -35,21 +37,54 @@ const sortedInsert = (list, sortFn, item) => {
const sortedRemove = (list, sortFn, item) => {
let itemId = item.id
- return list.filter(x => x.id !== itemId)
+ let l = list.filter(x => x.id !== itemId)
+ l.indexOf = x => sortedIndexOf(l, x, sortFn)
+ return l
+}
+
+export function sortedIndexOf(list, value, sortFn) {
+ if (sortFn === false){
+ let i = 0
+ while (i < list.length && list[i].id !== value.id){
+ i++
+ }
+ return i
+ }
+
+ let low = 0,
+ high = list.length,
+ val = sortFn(value),
+ mid;
+ while (low < high) {
+ mid = (low + high) >>> 1;
+ if ((sortFn(list[mid]) < val) ) {
+ low = mid + 1
+ } else {
+ high = mid
+ }
+ }
+
+ // Two flows may have the same sort value.
+ // we previously determined the leftmost flow with the same sort value,
+ // so no we need to scan linearly
+ while (list[low].id !== value.id && sortFn(list[low + 1]) === val) {
+ low++
+ }
+ return low;
}
// for when the list changes
-export function updateViewList(state, currentList, nextList, action, filterFn = defaultFilterFn, sortFn = defaultSortFn) {
+export function updateViewList(currentView, currentList, nextList, action, filterFn = defaultFilterFn, sortFn = defaultSortFn) {
switch (action.cmd) {
case REQUEST_LIST:
- return state
+ return currentView
case RECEIVE_LIST:
- return updateViewFilter(nextList.list, filterFn, sortFn)
+ return updateViewFilter(nextList, filterFn, sortFn)
case ADD:
if (filterFn(action.item)) {
- return sortedInsert(state, sortFn, action.item)
+ return sortedInsert(currentView, sortFn, action.item)
}
- return state
+ return currentView
case UPDATE:
// let's determine if it's in the view currently and if it should be in the view.
let currentItemState = currentList.byId[action.item.id],
@@ -58,30 +93,34 @@ export function updateViewList(state, currentList, nextList, action, filterFn =
shouldBeInView = filterFn(nextItemState)
if (!isInView && shouldBeInView)
- return sortedInsert(state, sortFn, action.item)
+ return sortedInsert(currentView, sortFn, action.item)
if (isInView && !shouldBeInView)
- return sortedRemove(state, sortFn, action.item)
- if (isInView && shouldBeInView && sortFn(currentItemState) !== sortFn(nextItemState)) {
- let s = [...state]
- s.sort(sortFn)
+ return sortedRemove(currentView, sortFn, action.item)
+ if (isInView && shouldBeInView && sortFn && sortFn(currentItemState) !== sortFn(nextItemState)) {
+ let s = [...currentView]
+ s.sort(makeCompareFn(sortFn))
+ s.indexOf = x => sortedIndexOf(s, x, sortFn)
return s
}
- return state
+ return currentView
case REMOVE:
let isInView_ = filterFn(currentList.byId[action.item.id])
if (isInView_) {
- return sortedRemove(state, sortFn, action.item)
+ return sortedRemove(currentView, sortFn, action.item)
}
- return state
+ return currentView
default:
console.error("Unknown list action: ", action)
- return state
+ return currentView
}
}
export function updateViewFilter(list, filterFn = defaultFilterFn, sortFn = defaultSortFn) {
- let filtered = list.filter(filterFn)
- if (sortFn)
+ let filtered = list.list.filter(filterFn)
+ if (sortFn){
filtered.sort(makeCompareFn(sortFn))
+ }
+ filtered.indexOf = x => sortedIndexOf(filtered, x, sortFn)
+
return filtered
} \ No newline at end of file