Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const {of} = require('rxjs')
- const {scan, pipe, map} = require('rxjs/operators')
- const constant = {
- STATUS_WON: 'won',
- STATUS_IN_PROGRESS: 'in-progress',
- STATUS_LOSE: 'lose',
- }
- function hangmanReactive(secretWord, letters) {
- const initialState = initState({secretWord})
- return letters.pipe(
- scan(stateUpdater, initialState),
- map(state => {
- const {secretWord, ...restState} = state
- return restState
- }),
- )
- // .subscribe(subscriber)
- }
- function initState({secretWord = '', ...optionState} = {}) {
- const initialState = {
- status: constant.STATUS_IN_PROGRESS,
- selectedLetters: [],
- lifeLeft: 7,
- knownSecretWord: '_______',
- }
- return {
- ...initialState,
- ...optionState,
- secretWordLength: secretWord.length,
- secretWord,
- }
- }
- function stateUpdater(state = {}, answer) {
- const {secretWord, selectedLetters, lifeLeft, status} = state
- if (status === constant.STATUS_WON) return state
- if (lifeLeft <= 0) {
- return {
- ...state,
- status: constant.STATUS_LOSE,
- }
- }
- const isChose = selectedLetters.includes(answer)
- if (isChose) return state
- const newSelectedLetters = selectedLetters.concat(answer)
- const isMatched = secretWord.includes(answer)
- if (isMatched) {
- const newKnownSecretWord = generateKnownSecretWord({
- selectedLetters: newSelectedLetters,
- secretWord,
- })
- return {
- ...state,
- selectedLetters: newSelectedLetters,
- knownSecretWord: newKnownSecretWord,
- status: isWin(newKnownSecretWord) ? constant.STATUS_WON : state.status,
- }
- }
- const newLifeLeft = lifeLeft - 1
- const isLose = newLifeLeft <= 0
- return {
- ...state,
- selectedLetters: newSelectedLetters,
- lifeLeft: newLifeLeft,
- status: isLose ? constant.STATUS_LOSE : state.status,
- }
- }
- function generateKnownSecretWord({selectedLetters, secretWord}) {
- const selectedLettersStr = selectedLetters.join('')
- const notSelected = new RegExp(`[^${selectedLettersStr}]`, 'g')
- return secretWord.replace(notSelected, '_')
- }
- function isWin(knownSecretWord) {
- return !/_/.test(knownSecretWord)
- }
- module.exports = {hangmanReactive}
Add Comment
Please, Sign In to add comment