-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathindex.ts
More file actions
106 lines (89 loc) · 2.42 KB
/
index.ts
File metadata and controls
106 lines (89 loc) · 2.42 KB
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
export interface ISpecification<T> {
isSatisfiedBy: (target: T) => boolean;
and: (other: ISpecification<T>) => ISpecification<T>;
or: (other: ISpecification<T>) => ISpecification<T>;
andNot: (other: ISpecification<T>) => ISpecification<T>;
orNot: (other: ISpecification<T>) => ISpecification<T>;
not: () => ISpecification<T>;
}
export abstract class Specification<T> implements ISpecification<T> {
abstract isSatisfiedBy(target: T): boolean;
and(other: ISpecification<T>): ISpecification<T> {
return new AndSpecification<T>(this, other);
}
or(other: ISpecification<T>): ISpecification<T> {
return new OrSpecification<T>(this, other);
}
orNot(other: ISpecification<T>): ISpecification<T> {
return new OrNotSpecification<T>(this, other);
}
andNot(other: ISpecification<T>): ISpecification<T> {
return new AndNotSpecification<T>(this, other);
}
not(): ISpecification<T> {
return new NotSpecification<T>(this);
}
}
export class AndSpecification<T> extends Specification<T> {
constructor(
private readonly one: ISpecification<T>,
private readonly other: ISpecification<T>,
) {
super();
}
isSatisfiedBy(target: T): boolean {
return (
this.one.isSatisfiedBy(target) && this.other.isSatisfiedBy(target)
);
}
}
export class OrSpecification<T> extends Specification<T> {
constructor(
private readonly one: ISpecification<T>,
private readonly other: ISpecification<T>,
) {
super();
}
isSatisfiedBy(target: T): boolean {
return (
this.one.isSatisfiedBy(target) || this.other.isSatisfiedBy(target)
);
}
}
export class OrNotSpecification<T> extends Specification<T> {
constructor(
private readonly one: ISpecification<T>,
private readonly other: ISpecification<T>,
) {
super();
}
isSatisfiedBy(target: T): boolean {
return (
(this.one.isSatisfiedBy(target) ||
this.other.isSatisfiedBy(target)) !== true
);
}
}
export class AndNotSpecification<T> extends Specification<T> {
constructor(
private readonly one: ISpecification<T>,
private readonly other: ISpecification<T>,
) {
super();
}
isSatisfiedBy(target: T): boolean {
return (
(this.one.isSatisfiedBy(target) &&
this.other.isSatisfiedBy(target)) !== true
);
}
}
export class NotSpecification<T> extends Specification<T> {
constructor(private readonly other: ISpecification<T>) {
super();
}
isSatisfiedBy(target: T): boolean {
return !this.other.isSatisfiedBy(target);
}
}
export default Specification;