yasshi2525/RushHour

View on GitHub
client/src/interfaces/monitor.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { Chunk, Point, ResolveError } from "./gamemap";

/**
 * 変更監視ができるクラスを表すインタフェース
 */
export interface Monitorable {
  /**
   * デフォルト値を設定します。
   * ここでセットされた値は監視対象プロパティになります。
   */
  setupDefaultValues(): void;

  /**
   * プロパティ更新時に呼び出すコールバック関数を設定します。
   */
  setupUpdateCallback(): void;

  /**
   * 初期値を代入します。
   * @param props
   */
  setInitialValues(props: { [index: string]: {} }): void;

  /**
   * 変更監視開始前に呼び出されるコールバック関数を設定します。
   */
  setupBeforeCallback(): void;

  /**
   * 変更監視終了前に呼び出されるコールバック関数を設定します。
   */
  setupAfterCallback(): void;

  /**
   * 描画前に呼び出されるコールバック関数を設定します。
   */
  updateDisplayInfo(): void;

  /**
   * 監視を開始します。
   */
  begin(): void;

  get(key: string): any;
  position(): Point | undefined;

  /**
   * 引数のチャンク上に存在するか取得します。
   * @param chunk
   */
  standOnChunk(chunk: Chunk): boolean;

  /**
   * keyに対応するプロパティが定義されているとき、値を更新します.
   * keyに対応するプロパティが定義されていないときは無視します。
   * @param key
   * @param value
   */
  merge(key: string, value: any): void;

  /**
   * 一括代入します。
   * @param payload プロパティが定義された連想配列
   */
  mergeAll(payload: { [index: string]: {} }): void;

  /**
   * 画面外の領域にあり、監視を終了すべきかどうかを返します。
   */
  shouldEnd(): boolean;

  /**
   * 監視を終了します。
   * @param callback 変更監視終了時に呼び出されるコールバック関数
   */
  end(): void;

  /**
   * 変更フラグをたてます
   */
  change(): void;

  /**
   * 前回の reset 以降に変更があったか取得します
   */
  isChanged(): boolean;

  /**
   * 変更フラグをおろします
   */
  reset(): void;

  resolve(error: ResolveError): ResolveError;
}

export interface MonitorContainer extends Monitorable {
  existsChild(id: number): boolean;
  getChild(id: number | undefined): Monitorable;
  getChildOnChunk(chunk: Chunk, oid: number): Monitorable | undefined;
  mergeChild(payload: { id: number }): Monitorable;
  /**
   * このなかに存在しない child は outMap 属性が true になります
   * @param payload
   * @param opts 全child共通に設定するプロパティ
   */
  mergeChildren(
    payload: { id: number }[],
    opts: { [index: string]: any }
  ): void;
  forEachChild(func: (c: Monitorable) => any): void;
  /**
   * shouldEndをみたすchildを削除します
   */
  endChildren(): void;
  removeChild(id: number): void;
}

export function startMonitor(
  model: Monitorable,
  props: { [index: string]: any }
) {
  model.setupDefaultValues();
  model.setupUpdateCallback();
  model.setupBeforeCallback();
  model.setupAfterCallback();
  model.setInitialValues(props);
  model.begin();
}