shogi-player
Version:
Shogi board web components has functions for replaying, manipulating, and editing
114 lines (93 loc) • 2.36 kB
JavaScript
import assert from "minimalistic-assert"
import { Mark } from "./mark.js"
export class MarkList {
static create(marks = []) {
return new this(marks)
}
////////////////////////////////////////////////////////////////////////////////
constructor(marks = []) {
this.reset(marks)
}
reset(ary = []) {
this._items = ary.map(attrs => Mark.create(attrs))
}
clear() {
this.reset([])
}
// あれば削除してなければ追加する
toggle(mark) {
if (this.any_p(mark)) {
this.remove(mark)
} else {
this.push(mark)
}
}
// なければ追加する
push(mark) {
mark = Mark.create(mark)
if (!this.any_p(mark)) {
this._items.push(mark)
}
}
// あれば削除する
remove(mark) {
mark = Mark.create(mark)
if (this.any_p(mark)) {
this._items = this._items.filter(e => !e.equal_p(mark))
}
}
// すでにあるか?
any_p(mark) {
mark = Mark.create(mark)
return this._items.some(e => e.equal_p(mark))
}
// 含むか?
include_p(mark) {
return this.any_p(mark)
}
// 含まないか?
exclude_p(mark) {
return !this.include_p(mark)
}
// 位置をキーにしたハッシュを返す
get marks_hash() {
return this._items.reduce((a, e) => {
assert(e.mark_pos_key)
if (!a[e.mark_pos_key]) {
a[e.mark_pos_key] = []
}
a[e.mark_pos_key].push(e)
return a
}, {})
}
get as_json() {
return this.to_a.map(e => e.as_json)
}
toJSON() {
return this.as_json
}
get to_a() {
return this._items
}
//////////////////////////////////////////////////////////////////////////////// toggle 処理のコマンド化
// toggle コマンド生成
toggle_command_create(mark) {
return {
method: this.include_p(mark) ? "remove" : "push",
params: mark,
}
}
// toggle_command_create で生成した内容を反映する
toggle_command_apply(command) {
if (command.method === "push") {
this.push(command.params)
} else if (command.method === "remove") {
this.remove(command.params)
} else {
throw new Error("must not happen")
}
}
////////////////////////////////////////////////////////////////////////////////
}
if (typeof process !== "undefined" && process.argv[1] === __filename) {
}