import { interval, fromEvent, combineLatest, BehaviorSubject } from 'rxjs';
import { scan, startWith, map, takeWhile, switchMap } from 'rxjs/operators';
import { State, Letter, Letters } from './interfaces';
const randomLetter = () =>
Math.random() * ('z'.charCodeAt(0) - 'a'.charCodeAt(0)) + 'a'.charCodeAt(0)
const levelChangeThreshold = 20;
const intervalSubject = new BehaviorSubject(600);
const letters$ = intervalSubject.pipe(
yPos: Math.floor(Math.random() * gameWidth)
const keys$ = fromEvent(document, 'keydown').pipe(
map((e: KeyboardEvent) => e.key)
const renderGame = (state: State) => (
(document.body.innerHTML = `Score: ${state.score}, Level: ${state.level} <br/>`),
(document.body.innerHTML += ' '.repeat(l.yPos) + l.letter + '<br/>')
(document.body.innerHTML +=
'<br/>'.repeat(endThreshold - state.letters.length - 1) +
const renderGameOver = () => (document.body.innerHTML += '<br/>GAME OVER!');
const game$ = combineLatest(keys$, letters$).pipe(
scan<[string, Letters], State>
((state, [key, letters]) => (
letters.ltrs[letters.ltrs.length - 1] &&
letters.ltrs[letters.ltrs.length - 1].letter === key
? ((state.score = state.score + 1), letters.ltrs.pop())
state.score > 0 && state.score % levelChangeThreshold === 0
(state.level = state.level + 1),
(state.score = state.score + 1),
intervalSubject.next(letters.intrvl - speedAdjust))
{ score: state.score, letters: letters.ltrs, level: state.level }
{ score: 0, letters: [], level: 1 }),
takeWhile(state => state.letters.length < endThreshold)
game$.subscribe(renderGame, noop, renderGameOver);