import type { DataSource } from '../DataSource' import type { BlockedRequest } from './BlockedRequest' import type { Chunk } from '@principia/base/Chunk' import type { HashMap } from '@principia/base/HashMap' import * as C from '@principia/base/Chunk' import * as HM from '@principia/base/HashMap' import * as It from '@principia/base/Iterable' import * as M from '@principia/base/Maybe' import { Sequential } from './Sequential' export class Parallel { readonly _tag = 'Parallel' constructor(private map: HashMap, Chunk>>) {} ['++'](that: Parallel): Parallel { return new Parallel( It.foldl_(that.map, this.map, (map, [k, v]) => HM.set_( map, k, M.match_(HM.get_(map, k), () => v, C.concat(v)) ) ) ) } get isEmpty() { return this.map.size === 0 } get keys(): Iterable> { return HM.keys(this.map) } get sequential(): Sequential { return new Sequential(HM.map_(this.map, C.single)) } get toIterable(): Iterable, Chunk>]> { return this.map } } export function empty(): Parallel { return new Parallel(HM.makeDefault()) } export function from(dataSource: DataSource, blockedRequest: BlockedRequest) { return new Parallel(HM.set_(HM.makeDefault(), dataSource, C.single(blockedRequest))) }