Guest User

Untitled

a guest
Sep 26th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.11 KB | None | 0 0
  1. const {of} = require('rxjs')
  2. const {scan, pipe, map} = require('rxjs/operators')
  3.  
  4. const constant = {
  5. STATUS_WON: 'won',
  6. STATUS_IN_PROGRESS: 'in-progress',
  7. STATUS_LOSE: 'lose',
  8. }
  9.  
  10. function hangmanReactive(secretWord, letters) {
  11. const initialState = initState({secretWord})
  12. return letters.pipe(
  13. scan(stateUpdater, initialState),
  14. map(state => {
  15. const {secretWord, ...restState} = state
  16. return restState
  17. }),
  18. )
  19. // .subscribe(subscriber)
  20. }
  21.  
  22. function initState({secretWord = '', ...optionState} = {}) {
  23. const initialState = {
  24. status: constant.STATUS_IN_PROGRESS,
  25. selectedLetters: [],
  26. lifeLeft: 7,
  27. knownSecretWord: '_______',
  28. }
  29. return {
  30. ...initialState,
  31. ...optionState,
  32. secretWordLength: secretWord.length,
  33. secretWord,
  34. }
  35. }
  36.  
  37. function stateUpdater(state = {}, answer) {
  38. const {secretWord, selectedLetters, lifeLeft, status} = state
  39.  
  40. if (status === constant.STATUS_WON) return state
  41.  
  42. if (lifeLeft <= 0) {
  43. return {
  44. ...state,
  45. status: constant.STATUS_LOSE,
  46. }
  47. }
  48.  
  49. const isChose = selectedLetters.includes(answer)
  50. if (isChose) return state
  51.  
  52. const newSelectedLetters = selectedLetters.concat(answer)
  53.  
  54. const isMatched = secretWord.includes(answer)
  55. if (isMatched) {
  56. const newKnownSecretWord = generateKnownSecretWord({
  57. selectedLetters: newSelectedLetters,
  58. secretWord,
  59. })
  60.  
  61. return {
  62. ...state,
  63. selectedLetters: newSelectedLetters,
  64. knownSecretWord: newKnownSecretWord,
  65. status: isWin(newKnownSecretWord) ? constant.STATUS_WON : state.status,
  66. }
  67. }
  68.  
  69. const newLifeLeft = lifeLeft - 1
  70. const isLose = newLifeLeft <= 0
  71. return {
  72. ...state,
  73. selectedLetters: newSelectedLetters,
  74. lifeLeft: newLifeLeft,
  75. status: isLose ? constant.STATUS_LOSE : state.status,
  76. }
  77. }
  78.  
  79. function generateKnownSecretWord({selectedLetters, secretWord}) {
  80. const selectedLettersStr = selectedLetters.join('')
  81. const notSelected = new RegExp(`[^${selectedLettersStr}]`, 'g')
  82. return secretWord.replace(notSelected, '_')
  83. }
  84.  
  85. function isWin(knownSecretWord) {
  86. return !/_/.test(knownSecretWord)
  87. }
  88.  
  89. module.exports = {hangmanReactive}
Add Comment
Please, Sign In to add comment