Web Inspector: replace TypeVerifier with subclasses of WI.Collection
[WebKit-https.git] / Source / WebInspectorUI / UserInterface / Models / Collection.js
1 /*
2  * Copyright (C) 2016 Devin Rousso <webkit@devinrousso.com>. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 WI.Collection = class Collection extends WI.Object
27 {
28     constructor(items = [])
29     {
30         super();
31
32         this._items = new Set;
33
34         for (let item of items)
35             this.add(item);
36     }
37
38     // Public
39
40     get items() { return this._items; }
41
42     get displayName()
43     {
44         throw WI.NotImplementedError.subclassMustOverride();
45     }
46
47     objectIsRequiredType(object)
48     {
49         throw WI.NotImplementedError.subclassMustOverride();
50     }
51
52     add(item)
53     {
54         let isValidType = this.objectIsRequiredType(item);
55         console.assert(isValidType);
56         if (!isValidType)
57             return;
58
59         console.assert(!this._items.has(item));
60         this._items.add(item);
61
62         this.itemAdded(item);
63
64         this.dispatchEventToListeners(WI.Collection.Event.ItemAdded, {item});
65     }
66
67     remove(item)
68     {
69         let wasRemoved = this._items.delete(item);
70         console.assert(wasRemoved);
71
72         this.itemRemoved(item);
73
74         this.dispatchEventToListeners(WI.Collection.Event.ItemRemoved, {item});
75     }
76
77     clear()
78     {
79         let items = new Set(this._items);
80
81         this._items.clear();
82
83         this.itemsCleared(items);
84
85         for (let item of items)
86             this.dispatchEventToListeners(WI.Collection.Event.ItemRemoved, {item});
87     }
88
89     toArray()
90     {
91         return Array.from(this._items);
92     }
93
94     toJSON()
95     {
96         return this.toArray();
97     }
98
99      // Protected
100
101     itemAdded(item)
102     {
103         // Implemented by subclasses.
104     }
105
106     itemRemoved(item)
107     {
108         // Implemented by subclasses.
109     }
110
111     itemsCleared(items)
112     {
113         // Implemented by subclasses.
114     }
115 };
116
117 WI.Collection.Event = {
118     ItemAdded: "collection-item-added",
119     ItemRemoved: "collection-item-removed",
120 };
121