102 lines
2.1 KiB
TypeScript
102 lines
2.1 KiB
TypeScript
![]() |
export abstract class AsyncBooleanExpression<T>
|
||
|
{
|
||
|
abstract evaluate( t:T ):Promise<boolean>;
|
||
|
|
||
|
NOT():AsyncBooleanExpression<T>
|
||
|
{
|
||
|
return new NotAsyncExpression<T>( this );
|
||
|
}
|
||
|
|
||
|
AND( matcher:AsyncBooleanExpression<T>):AsyncBooleanExpression<T>
|
||
|
{
|
||
|
return new AndAsyncExpression<T>( [ this, matcher ] );
|
||
|
}
|
||
|
|
||
|
OR( matcher:AsyncBooleanExpression<T>):AsyncBooleanExpression<T>
|
||
|
{
|
||
|
return new OrAsyncExpression<T>( [ this, matcher ] );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export class NotAsyncExpression<T> extends AsyncBooleanExpression<T>
|
||
|
{
|
||
|
private _matcher:AsyncBooleanExpression<T>;
|
||
|
|
||
|
constructor( matcher:AsyncBooleanExpression<T> )
|
||
|
{
|
||
|
super();
|
||
|
this._matcher = matcher;
|
||
|
}
|
||
|
|
||
|
async evaluate( t:T ):Promise<boolean>
|
||
|
{
|
||
|
let result = await this._matcher.evaluate( t );
|
||
|
return Promise.resolve( ! result );
|
||
|
}
|
||
|
|
||
|
NOT()
|
||
|
{
|
||
|
return this._matcher;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export abstract class ListInputAsyncExpression<T> extends AsyncBooleanExpression<T>
|
||
|
{
|
||
|
protected _matchers:AsyncBooleanExpression<T>[];
|
||
|
|
||
|
constructor( matchers:AsyncBooleanExpression<T>[] )
|
||
|
{
|
||
|
super();
|
||
|
this._matchers = matchers;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export class AndAsyncExpression<T> extends ListInputAsyncExpression<T>
|
||
|
{
|
||
|
async evaluate( t:T ):Promise<boolean>
|
||
|
{
|
||
|
for ( let matcher of this._matchers )
|
||
|
{
|
||
|
let result = await matcher.evaluate( t );
|
||
|
|
||
|
if ( ! result )
|
||
|
{
|
||
|
return Promise.resolve( false );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return Promise.resolve( true );
|
||
|
}
|
||
|
|
||
|
AND( matcher:AsyncBooleanExpression<T> )
|
||
|
{
|
||
|
this._matchers.push( matcher );
|
||
|
return this;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export class OrAsyncExpression<T> extends ListInputAsyncExpression<T>
|
||
|
{
|
||
|
async evaluate( t:T ):Promise<boolean>
|
||
|
{
|
||
|
for ( let matcher of this._matchers )
|
||
|
{
|
||
|
let result = await matcher.evaluate( t );
|
||
|
|
||
|
if ( result )
|
||
|
{
|
||
|
return Promise.resolve( true );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return Promise.resolve( false );
|
||
|
}
|
||
|
|
||
|
OR( matcher:AsyncBooleanExpression<T> )
|
||
|
{
|
||
|
this._matchers.push( matcher );
|
||
|
return this;
|
||
|
}
|
||
|
}
|
||
|
|