library-ts/browser/expressions/AsyncBooleanExpression.ts

102 lines
2.1 KiB
TypeScript
Raw Permalink Normal View History

2025-03-08 08:16:54 +00:00
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;
}
}