File

packages/core/src/lib/utils/mvcarray-utils.ts

Implements

Index

Properties
Methods

Properties

Private listeners
Type : literal type
Default value : { remove_at: [], insert_at: [], set_at: [], }
Private vals
Type : T[]
Default value : []

Methods

addListener
addListener(eventName: "remove_at" | "insert_at" | "set_at", handler: (args: any[]) => void)
Parameters :
Name Type Optional
eventName "remove_at" | "insert_at" | "set_at" No
handler function No
Returns : google.maps.MapsEventListener
bindTo
bindTo()
Returns : never
changed
changed()
Returns : never
clear
clear()
Returns : void
forEach
forEach(callback: (elem: T,i: number) => void)
Parameters :
Name Type Optional
callback function No
Returns : void
get
get()
Returns : never
getArray
getArray()
Returns : T[]
getAt
getAt(i: number)
Parameters :
Name Type Optional
i number No
Returns : T
getLength
getLength()
Returns : number
insertAt
insertAt(i: number, elem: T)
Parameters :
Name Type Optional
i number No
elem T No
Returns : void
notify
notify()
Returns : never
pop
pop()
Returns : T
push
push(elem: T)
Parameters :
Name Type Optional
elem T No
Returns : number
removeAt
removeAt(i: number)
Parameters :
Name Type Optional
i number No
Returns : T
set
set()
Returns : never
setAt
setAt(i: number, elem: T)
Parameters :
Name Type Optional
i number No
elem T No
Returns : void
setValues
setValues()
Returns : never
unbind
unbind()
Returns : never
unbindAll
unbindAll()
Returns : never
import { fromEventPattern, Observable } from 'rxjs';

export function createMVCEventObservable<T>(array: google.maps.MVCArray<T>): Observable<MVCEvent<T>>{
  const eventNames = ['insert_at', 'remove_at', 'set_at'];
  return fromEventPattern(
    handler => eventNames.map(eventName => array.addListener(eventName,
      (index: number, previous?: T) => handler.apply(array, [ {newArr: array.getArray(), eventName, index, previous} as MVCEvent<T>]))),
    (_handler, evListeners: google.maps.MapsEventListener[]) => evListeners.forEach(evListener => evListener.remove()));
}

export type MvcEventType = 'insert_at' | 'remove_at' | 'set_at';

export interface MVCEvent<T> {
  newArr: T[];
  eventName: MvcEventType;
  index: number;
  previous?: T;
}

export class MvcArrayMock<T> implements google.maps.MVCArray<T> {
  private vals: T[] = [];
  private listeners: {
    'remove_at': ((i: number, r: T) => void)[];
    'insert_at': ((i: number) => void)[];
    'set_at': ((i: number, val: T) => void)[];
  } = {
    remove_at: [],
    insert_at: [],
    set_at: [],
  };
  clear(): void {
    for (let i = this.vals.length - 1; i >= 0; i--) {
        this.removeAt(i);
    }
  }
  getArray(): T[] {
    return [...this.vals];
  }
  getAt(i: number): T {
    return this.vals[i];
  }
  getLength(): number {
    return this.vals.length;
  }
  insertAt(i: number, elem: T): void {
    this.vals.splice(i, 0, elem);
    this.listeners.insert_at.forEach(listener => listener(i));
  }
  pop(): T {
    const deleted = this.vals.pop();
    this.listeners.remove_at.forEach(listener => listener(this.vals.length, deleted));
    return deleted;
  }
  push(elem: T): number {
    this.vals.push(elem);
    this.listeners.insert_at.forEach(listener => listener(this.vals.length - 1));
    return this.vals.length;
  }
  removeAt(i: number): T {
    const deleted = this.vals.splice(i, 1)[0];
    this.listeners.remove_at.forEach(listener => listener(i, deleted));
    return deleted;
  }
  setAt(i: number, elem: T): void {
    const deleted = this.vals[i];
    this.vals[i] = elem;
    this.listeners.set_at.forEach(listener => listener(i, deleted));
  }
  forEach(callback: (elem: T, i: number) => void): void {
    this.vals.forEach(callback);
  }
  addListener(eventName: 'remove_at' | 'insert_at' | 'set_at', handler: (...args: any[]) => void): google.maps.MapsEventListener {
    const listenerArr = this.listeners[eventName];
    listenerArr.push(handler);
    return {
        remove: () => {
            listenerArr.splice(listenerArr.indexOf(handler), 1);
        },
    };
  }

  bindTo(): never { throw new Error('Not implemented'); }
  changed(): never { throw new Error('Not implemented'); }
  get(): never { throw new Error('Not implemented'); }
  notify(): never { throw new Error('Not implemented'); }
  set(): never { throw new Error('Not implemented'); }
  setValues(): never { throw new Error('Not implemented'); }
  unbind(): never { throw new Error('Not implemented'); }
  unbindAll(): never { throw new Error('Not implemented'); }
}

result-matching ""

    No results matching ""