1
Fork 0

typescript(loopover): feat: added a basic GameState class

Signed-off-by: prescientmoon <git@moonythm.dev>
This commit is contained in:
Matei Adriel 2019-11-25 09:56:09 +02:00 committed by prescientmoon
parent 91e8f869aa
commit 6894448f60
Signed by: prescientmoon
SSH key fingerprint: SHA256:UUF9JT2s8Xfyv76b8ZuVL7XrmimH4o49p4b+iexbVH4
6 changed files with 64 additions and 1 deletions

View file

@ -22,7 +22,8 @@
"author": "Matei Adriel", "author": "Matei Adriel",
"license": "GPL-3.0", "license": "GPL-3.0",
"dependencies": { "dependencies": {
"@thi.ng/api": "^6.5.0" "@thi.ng/api": "^6.5.0",
"immutable": "^4.0.0-rc.12"
}, },
"sideEffects": false, "sideEffects": false,
"devDependencies": { "devDependencies": {

View file

@ -1,5 +1,6 @@
dependencies: dependencies:
'@thi.ng/api': 6.5.0 '@thi.ng/api': 6.5.0
immutable: 4.0.0-rc.12
devDependencies: devDependencies:
'@types/chai': 4.2.5 '@types/chai': 4.2.5
'@types/mocha': 5.2.7 '@types/mocha': 5.2.7
@ -232,6 +233,10 @@ packages:
node: '>=4' node: '>=4'
resolution: resolution:
integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0= integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
/immutable/4.0.0-rc.12:
dev: false
resolution:
integrity: sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A==
/inflight/1.0.6: /inflight/1.0.6:
dependencies: dependencies:
once: 1.4.0 once: 1.4.0
@ -552,6 +557,7 @@ specifiers:
'@types/mocha': ^5.2.7 '@types/mocha': ^5.2.7
'@types/node': ^12.12.12 '@types/node': ^12.12.12
chai: ^4.2.0 chai: ^4.2.0
immutable: ^4.0.0-rc.12
rimraf: ^3.0.0 rimraf: ^3.0.0
rollup: ^1.27.5 rollup: ^1.27.5
rollup-plugin-commonjs: ^10.1.0 rollup-plugin-commonjs: ^10.1.0

View file

@ -0,0 +1,45 @@
import { assert } from '@thi.ng/api'
import { List } from 'immutable'
import { Direction } from '../types/direction'
import { rangeArray } from '../helpers/rangeArray'
export class GameState {
public height: number
public constructor(public cells: List<number>, public width: number) {
const height = cells.count() / width
assert(
height === Math.floor(height),
`Recived non-integer height: ${height}`
)
this.height = height
}
public moveX(direction: Direction, layers: Iterable<number>) {
const newState = this.cells.withMutations(list => {
for (const layer of layers) {
const slice = list.slice(
layer * this.width,
(layer + 1) * this.width
)
if (direction === -1) {
const first = slice.first<number>()
slice.shift()
slice.push(first)
} else if (direction === 1) {
const last = slice.last<number>()
slice.unshift(last)
}
for (let i = 0; i < slice.count(); i++) {
list[i + layer * this.width] = slice[i]
}
}
})
return new GameState(newState, this.width)
}
}

View file

@ -0,0 +1,6 @@
import { rangeArray } from './rangeArray'
export const chunkX = <T>(arr: T[], width: number, height: number): T[][] =>
rangeArray(0, this.height).map(index =>
arr.slice(index * height, (index + 1) * width)
)

View file

@ -0,0 +1,4 @@
export const rangeArray = (start: number, end: number) =>
Array(end - start)
.fill(true)
.map((_, i) => i + start)

View file

@ -0,0 +1 @@
export type Direction = -1 | 1