UNPKG

scrabble-solver

Version:

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

70 lines (45 loc) 2.64 kB
import { createSelector } from '@reduxjs/toolkit'; import { getConfig } from '@scrabble-solver/configs'; import { BLANK } from '@scrabble-solver/constants'; import { type Cell, type Tile } from '@scrabble-solver/types'; import { i18n, LOCALE_FEATURES } from 'i18n'; import type { RootState } from '../types'; const selectCell = (_: unknown, cell: Cell): Cell => cell; const selectCharacter = (_: unknown, character: string | null): string | null => character; const selectTile = (_: unknown, tile: Tile | null): Tile | null => tile; export const selectSettings = (state: RootState) => state.settings; export const selectAutoGroupTiles = createSelector([selectSettings], (settings) => settings.autoGroupTiles); export const selectGame = createSelector([selectSettings], (settings) => settings.game); export const selectInputMode = createSelector([selectSettings], (settings) => settings.inputMode); export const selectLocale = createSelector([selectSettings], (settings) => settings.locale); export const selectLocaleAutoGroupTiles = createSelector([selectLocale, selectSettings], (locale, settings) => { if (LOCALE_FEATURES[locale].direction === 'ltr' || settings.autoGroupTiles === null) { return settings.autoGroupTiles; } return settings.autoGroupTiles === 'left' ? 'right' : 'left'; }); export const selectShowCoordinates = createSelector([selectSettings], (settings) => settings.showCoordinates); export const selectConfig = createSelector([selectGame, selectLocale], getConfig); export const selectCharacterPoints = createSelector([selectConfig, selectCharacter], (config, character) => { return config.getCharacterPoints(character); }); export const selectCharacterIsValid = createSelector([selectConfig, selectCharacter], (config, character) => { if (character === null || character === BLANK) { return true; } return config.tiles.some((tile) => tile.character === character); }); export const selectCellBonus = createSelector([selectConfig, selectCell], (config, cell) => { return config.getCellBonus(cell); }); export const selectTilePoints = createSelector([selectConfig, selectTile], (config, tile) => { return config.getTilePoints(tile); }); export const selectCellIsValid = createSelector([selectConfig, selectCell], (config, cell) => { if (!cell.hasTile()) { return true; } return config.tiles.some((tile) => tile.character === cell.tile.character); }); export const selectTranslations = createSelector([selectLocale], (locale) => i18n[locale]); export const selectRemoveCellFilters = createSelector([selectSettings], (settings) => settings.removeCellFilters);