import type { Described } from './Described' import * as I from '@principia/base/IO' import { batchN_, DataSource } from './DataSource' export class DataSourceAspect { readonly _tag = 'DataSourceAspect' constructor(readonly apply: (dataSource: DataSource) => DataSource) {} } export function around( before: Described>, after: Described<(a: A) => I.IO> ): DataSourceAspect { return new DataSourceAspect((dataSource: DataSource): DataSource => { return new DataSource( `${dataSource.identifier} @@ around(${before.description}, ${after.description})`, (requests) => I.bracket_(before.value, (_) => dataSource.runAll(requests), after.value) ) }) } export function maxBatchSize(n: number): DataSourceAspect { return new DataSourceAspect((dataSource: DataSource): DataSource => batchN_(dataSource, n)) } export function compose_(self: DataSourceAspect, that: DataSourceAspect): DataSourceAspect { return new DataSourceAspect((dataSource) => that.apply(self.apply(dataSource))) }