|
|
|
@ -4,6 +4,9 @@ import { parseText } from '../lib/parseText'
|
|
|
|
|
import { getNextBiggerNumber, getNextSmallerNumber } from '../lib/array-util.js'
|
|
|
|
|
import { pivotize } from '../lib/pivotize'
|
|
|
|
|
|
|
|
|
|
// util
|
|
|
|
|
const notNull = val => val != null
|
|
|
|
|
|
|
|
|
|
// parsedText selectors
|
|
|
|
|
|
|
|
|
|
export const selectMaxLength = state => state.maxLength
|
|
|
|
@ -19,6 +22,8 @@ export const selectSegments = createSelector(
|
|
|
|
|
parsedText => parsedText.segments
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// segments
|
|
|
|
|
|
|
|
|
|
export const selectCurrentSegmentIndex = state => state.curIdx
|
|
|
|
|
|
|
|
|
|
export const selectCurrentSegment = createSelector(
|
|
|
|
@ -32,12 +37,32 @@ export const selectPivotizedSegment = createSelector(
|
|
|
|
|
pivotize
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
export const hasNextSegment = createSelector(
|
|
|
|
|
export const selectNextSegment = state => state.curIdx + 1
|
|
|
|
|
export const selectPrevSegment = state => state.curIdx - 1
|
|
|
|
|
|
|
|
|
|
export const selectHasNextSegment = createSelector(
|
|
|
|
|
selectSegments,
|
|
|
|
|
selectCurrentSegmentIndex,
|
|
|
|
|
(segments, idx) => {
|
|
|
|
|
return idx < segments.length - 1
|
|
|
|
|
}
|
|
|
|
|
(segments, idx) => idx < segments.length - 1
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
export const selectHasPrevSegment = createSelector(
|
|
|
|
|
selectCurrentSegmentIndex,
|
|
|
|
|
idx => idx > 0
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
export const safeSelectNextSegment = createSelector(
|
|
|
|
|
selectHasNextSegment,
|
|
|
|
|
selectNextSegment,
|
|
|
|
|
selectCurrentSegmentIndex,
|
|
|
|
|
(has, segment, idx) => (has ? segment : idx)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
export const safeSelectPrevSegment = createSelector(
|
|
|
|
|
selectHasPrevSegment,
|
|
|
|
|
selectPrevSegment,
|
|
|
|
|
selectCurrentSegmentIndex,
|
|
|
|
|
(has, segment, idx) => (has ? segment : idx)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// next/prev words
|
|
|
|
@ -56,11 +81,26 @@ export const selectNextWord = createSelector(
|
|
|
|
|
export const selectPrevWord = createSelector(
|
|
|
|
|
selectWords,
|
|
|
|
|
selectCurrentSegmentIndex,
|
|
|
|
|
(words, curSegment) => getNextSmallerNumber(curSegment, words)
|
|
|
|
|
(words, curSegment) => {
|
|
|
|
|
console.log(words, curSegment, getNextSmallerNumber(curSegment, words))
|
|
|
|
|
return getNextSmallerNumber(curSegment, words)
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
export const selectHasNextWord = createSelector(selectNextWord, Boolean)
|
|
|
|
|
export const selectHasPrevWord = createSelector(selectPrevWord, Boolean)
|
|
|
|
|
export const selectHasNextWord = createSelector(selectNextWord, notNull)
|
|
|
|
|
export const selectHasPrevWord = createSelector(selectPrevWord, notNull)
|
|
|
|
|
export const safeSelectNextWord = createSelector(
|
|
|
|
|
selectHasNextWord,
|
|
|
|
|
selectNextWord,
|
|
|
|
|
selectCurrentSegmentIndex,
|
|
|
|
|
(has, word, idx) => (has ? word : idx)
|
|
|
|
|
)
|
|
|
|
|
export const safeSelectPrevWord = createSelector(
|
|
|
|
|
selectHasPrevWord,
|
|
|
|
|
selectPrevWord,
|
|
|
|
|
selectCurrentSegmentIndex,
|
|
|
|
|
(has, word, idx) => (has ? word : idx)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// next/prev sentences
|
|
|
|
|
|
|
|
|
@ -81,8 +121,24 @@ export const selectPrevSentence = createSelector(
|
|
|
|
|
(sentences, curSegment) => getNextSmallerNumber(curSegment, sentences)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
export const selectHasNextSentence = createSelector(selectNextSentence, Boolean)
|
|
|
|
|
export const selectHasPrevSentence = createSelector(selectPrevSentence, Boolean)
|
|
|
|
|
export const selectHasNextSentence = createSelector(selectNextSentence, notNull)
|
|
|
|
|
export const selectHasPrevSentence = createSelector(selectPrevSentence, notNull)
|
|
|
|
|
|
|
|
|
|
export const safeSelectNextSentence = createSelector(
|
|
|
|
|
selectHasNextSentence,
|
|
|
|
|
selectNextSentence,
|
|
|
|
|
selectCurrentSegmentIndex,
|
|
|
|
|
(has, sentence, idx) => (has ? sentence : idx)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
export const safeSelectPrevSentence = createSelector(
|
|
|
|
|
selectHasPrevSentence,
|
|
|
|
|
selectPrevSentence,
|
|
|
|
|
selectCurrentSegmentIndex,
|
|
|
|
|
(has, sentence, idx) => (has ? sentence : idx)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// options
|
|
|
|
|
|
|
|
|
|
export const selectWpm = state => state.wpm
|
|
|
|
|
export const selectInterval = createSelector(selectWpm, wpm => 60000 / wpm)
|
|
|
|
|