-
Notifications
You must be signed in to change notification settings - Fork 16
/
TypesCollection.ts
63 lines (55 loc) · 1.75 KB
/
TypesCollection.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import { hydra } from "../../namespaces";
import FilterableCollection from "./FilterableCollection";
/**
* Provides a collection of types that can be filtered with relevant criteria.
* @class
*/
export default class TypesCollection extends FilterableCollection<string> {
/**
* Defines an empty types collection.
* @constant {TypesCollection}
*/
public static readonly empty = new TypesCollection();
/**
* Initializes a new instance of the {@link TypesCollection} class with initial collections of types to filter.
* @param {Iterable<string>} [types] Initial collection of types to filter.
*/
public constructor(types?: Iterable<string>) {
let actualTypes = types;
if (!!actualTypes) {
let typeArray: string[] = types as string[];
if (!(actualTypes instanceof Array)) {
typeArray = Array.from(actualTypes);
}
actualTypes = typeArray.filter((item, index) => typeArray.indexOf(item) === index);
}
super(actualTypes);
}
/**
* Gets a value indicating that resource owning this type's collection has hydra:Collection type.
* @returns {boolean}
*/
public get isCollection(): boolean {
return this.contains(hydra.Collection);
}
/**
* Checks whether this collection has a given type.
* @param {string} type Type to look for.
* @returns {boolean}
*/
public contains(type: string): boolean {
return this.where(item => item === type).any();
}
/**
*
* @param {string} type
* @returns {TypesCollection}
*/
public except(type: string): TypesCollection {
return this.where(item => item !== type) as TypesCollection;
}
/** @inheritdoc */
protected createInstance(items: Iterable<string>): TypesCollection {
return new TypesCollection(items);
}
}