1
0
mirror of https://github.com/ianstormtaylor/slate.git synced 2025-08-29 09:59:48 +02:00

add memoization and performance improvements to selections

This commit is contained in:
Ian Storm Taylor
2016-07-21 00:54:00 -07:00
parent 9674f2fafb
commit 99bb4a330a

View File

@@ -1,5 +1,6 @@
import includes from 'lodash/includes' import includes from 'lodash/includes'
import memoize from '../utils/memoize'
import { Record } from 'immutable' import { Record } from 'immutable'
/** /**
@@ -143,8 +144,9 @@ class Selection extends new Record(DEFAULTS) {
*/ */
hasAnchorAtStartOf(node) { hasAnchorAtStartOf(node) {
if (this.anchorOffset != 0) return false
const first = node.kind == 'text' ? node : node.getTexts().first() const first = node.kind == 'text' ? node : node.getTexts().first()
return this.anchorKey == first.key && this.anchorOffset == 0 return this.anchorKey == first.key
} }
/** /**
@@ -171,9 +173,9 @@ class Selection extends new Record(DEFAULTS) {
hasAnchorBetween(node, start, end) { hasAnchorBetween(node, start, end) {
return ( return (
this.hasAnchorIn(node) && this.anchorOffset <= end &&
start <= this.anchorOffset && start <= this.anchorOffset &&
this.anchorOffset <= end this.hasAnchorIn(node)
) )
} }
@@ -209,8 +211,9 @@ class Selection extends new Record(DEFAULTS) {
*/ */
hasFocusAtStartOf(node) { hasFocusAtStartOf(node) {
if (this.focusOffset != 0) return false
const first = node.kind == 'text' ? node : node.getTexts().first() const first = node.kind == 'text' ? node : node.getTexts().first()
return this.focusKey == first.key && this.focusOffset == 0 return this.focusKey == first.key
} }
/** /**
@@ -225,9 +228,9 @@ class Selection extends new Record(DEFAULTS) {
hasFocusBetween(node, start, end) { hasFocusBetween(node, start, end) {
return ( return (
this.hasFocusIn(node) &&
start <= this.focusOffset && start <= this.focusOffset &&
this.focusOffset <= end this.focusOffset <= end &&
this.hasFocusIn(node)
) )
} }
@@ -251,9 +254,11 @@ class Selection extends new Record(DEFAULTS) {
*/ */
isAtStartOf(node) { isAtStartOf(node) {
const { startKey, startOffset } = this const { isExpanded, startKey, startOffset } = this
if (isExpanded) return false
if (startOffset != 0) return false
const first = node.kind == 'text' ? node : node.getTexts().first() const first = node.kind == 'text' ? node : node.getTexts().first()
return this.isCollapsed && startKey == first.key && startOffset == 0 return startKey == first.key
} }
/** /**
@@ -264,9 +269,10 @@ class Selection extends new Record(DEFAULTS) {
*/ */
isAtEndOf(node) { isAtEndOf(node) {
const { endKey, endOffset } = this const { endKey, endOffset, isExpanded } = this
if (isExpanded) return false
const last = node.kind == 'text' ? node : node.getTexts().last() const last = node.kind == 'text' ? node : node.getTexts().last()
return this.isCollapsed && endKey == last.key && endOffset == last.length return endKey == last.key && endOffset == last.length
} }
/** /**
@@ -578,9 +584,22 @@ START_END_METHODS.concat(EDGE_METHODS).forEach((pattern) => {
}) })
/** /**
* Add edge methods. * Memoize read methods.
*/ */
memoize(Selection.prototype, [
'hasAnchorAtStartOf',
'hasAnchorAtEndOf',
'hasAnchorBetween',
'hasAnchorIn',
'hasFocusAtEndOf',
'hasFocusAtStartOf',
'hasFocusBetween',
'hasFocusIn',
'isAtStartOf',
'isAtEndOf'
])
/** /**
* Export. * Export.
*/ */