UNPKG

scrabble-solver

Version:

Scrabble Solver 2 - Free, open-source, cross-platform, multi-language analysis tool for Scrabble, Scrabble Duel, Super Scrabble, Letter League, Crossplay, Literaki, and Kelimelik. Quickly find the top-scoring words using the given board and tiles.

76 lines (55 loc) 2.35 kB
import { createSelector } from '@reduxjs/toolkit'; import { createRegExp } from '@/lib'; import { selectCellFilters } from '../cellFilters'; import { selectLocale, selectShowCoordinates } from '../settings'; import type { RootState } from '../types'; import { getCoordinates, groupResults, resultMatchesCellFilter, sortResults } from './lib'; const selectResultIndex = (_: unknown, index: number): number => index; export const selectResults = (state: RootState) => state.results; export const selectResultCandidate = createSelector([selectResults], (results) => results.candidate); export const selectResultsQuery = createSelector([selectResults], (results) => results.query); const selectResultsResults = createSelector([selectResults], (results) => results.results); export const selectResultsSort = createSelector([selectResults], (results) => results.sort); export const selectResultCandidateCells = createSelector( [selectResultCandidate], (resultCandidate) => resultCandidate?.cells ?? [], ); export const selectResultCandidateTiles = createSelector( [selectResultCandidate], (resultCandidate) => resultCandidate?.tiles ?? [], ); const selectSortedResults = createSelector( [selectResultsResults, selectResultsSort, selectLocale, selectShowCoordinates], sortResults, ); const selectGroupedSortedResults = createSelector( [selectSortedResults, selectResultsQuery, selectCellFilters], groupResults, ); export const selectProcessedResults = createSelector([selectGroupedSortedResults], (results) => { return results ? [...results.matching, ...results.other] : undefined; }); export const selectIsResultMatching = createSelector( [selectProcessedResults, selectResultsQuery, selectCellFilters, selectResultIndex], (results, query, cellFilters, index) => { if (!results) { return false; } const result = results[index]; const regExp = createRegExp(query); if (!regExp.test(result.word)) { return false; } return resultMatchesCellFilter(result, cellFilters); }, ); export const selectResultCoordinates = createSelector( [selectProcessedResults, selectShowCoordinates, selectResultIndex], (results, showCoordinates, index) => { if (!results) { return ''; } const result = results[index]; return getCoordinates(result, showCoordinates); }, );