1e484b35bSopenharmony_ci/*
2e484b35bSopenharmony_ci * Licensed to the Apache Software Foundation (ASF) under one
3e484b35bSopenharmony_ci * or more contributor license agreements.  See the NOTICE file
4e484b35bSopenharmony_ci * distributed with this work for additional information
5e484b35bSopenharmony_ci * regarding copyright ownership.  The ASF licenses this file
6e484b35bSopenharmony_ci * to you under the Apache License, Version 2.0 (the
7e484b35bSopenharmony_ci * "License"); you may not use this file except in compliance
8e484b35bSopenharmony_ci * with the License.  You may obtain a copy of the License at
9e484b35bSopenharmony_ci *
10e484b35bSopenharmony_ci *   http://www.apache.org/licenses/LICENSE-2.0
11e484b35bSopenharmony_ci *
12e484b35bSopenharmony_ci * Unless required by applicable law or agreed to in writing,
13e484b35bSopenharmony_ci * software distributed under the License is distributed on an
14e484b35bSopenharmony_ci * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15e484b35bSopenharmony_ci * KIND, either express or implied.  See the License for the
16e484b35bSopenharmony_ci * specific language governing permissions and limitations
17e484b35bSopenharmony_ci * under the License.
18e484b35bSopenharmony_ci */
19e484b35bSopenharmony_ci
20e484b35bSopenharmony_ciimport Page from '../page/index';
21e484b35bSopenharmony_ci
22e484b35bSopenharmony_ci/**
23e484b35bSopenharmony_ci * This class defines the map for the page instances.
24e484b35bSopenharmony_ci */
25e484b35bSopenharmony_ciexport class PageLinkedMap {
26e484b35bSopenharmony_ci  public _map: Page[];
27e484b35bSopenharmony_ci
28e484b35bSopenharmony_ci  constructor() {
29e484b35bSopenharmony_ci    this._map = [];
30e484b35bSopenharmony_ci  }
31e484b35bSopenharmony_ci
32e484b35bSopenharmony_ci  public unshift(instance: Page) {
33e484b35bSopenharmony_ci    this._map.unshift(instance);
34e484b35bSopenharmony_ci    Object.defineProperty(this, instance.id, {
35e484b35bSopenharmony_ci      configurable: true,
36e484b35bSopenharmony_ci      enumerable: true,
37e484b35bSopenharmony_ci      get: function proxyGetter() {
38e484b35bSopenharmony_ci        return proxyGet(this, instance.id);
39e484b35bSopenharmony_ci      }
40e484b35bSopenharmony_ci    });
41e484b35bSopenharmony_ci  }
42e484b35bSopenharmony_ci
43e484b35bSopenharmony_ci  public push(instance: Page) {
44e484b35bSopenharmony_ci    this._map.push(instance);
45e484b35bSopenharmony_ci    Object.defineProperty(this, instance.id, {
46e484b35bSopenharmony_ci      configurable: true,
47e484b35bSopenharmony_ci      enumerable: true,
48e484b35bSopenharmony_ci      get: function proxyGetter() {
49e484b35bSopenharmony_ci        return proxyGet(this, instance.id);
50e484b35bSopenharmony_ci      }
51e484b35bSopenharmony_ci    });
52e484b35bSopenharmony_ci  }
53e484b35bSopenharmony_ci
54e484b35bSopenharmony_ci  public remove(instance: Page) {
55e484b35bSopenharmony_ci    const index = this._map.indexOf(instance);
56e484b35bSopenharmony_ci    delete this[instance.id];
57e484b35bSopenharmony_ci    // @ts-ignore
58e484b35bSopenharmony_ci    delete this._map.splice(index, 1);
59e484b35bSopenharmony_ci  }
60e484b35bSopenharmony_ci
61e484b35bSopenharmony_ci  public getTop(packageName: string) {
62e484b35bSopenharmony_ci    const appMap = this._map.filter(instance => {
63e484b35bSopenharmony_ci      return instance.packageName === packageName;
64e484b35bSopenharmony_ci    });
65e484b35bSopenharmony_ci    return appMap && appMap[appMap.length - 1];
66e484b35bSopenharmony_ci  }
67e484b35bSopenharmony_ci}
68e484b35bSopenharmony_ci
69e484b35bSopenharmony_cifunction proxyGet(pageLinkedMap: PageLinkedMap, id: string) {
70e484b35bSopenharmony_ci  const index = pageLinkedMap._map.map(instance => instance.id).lastIndexOf(id);
71e484b35bSopenharmony_ci  return pageLinkedMap._map[index];
72e484b35bSopenharmony_ci}
73e484b35bSopenharmony_ci
74e484b35bSopenharmony_ciexport const pageMap: PageLinkedMap = new PageLinkedMap();
75e484b35bSopenharmony_ci
76e484b35bSopenharmony_ciexport const appMap = {};
77