import type { AnyRequest, Request } from './Request' import type { HashMap } from '@principia/base/HashMap' import type { HashSet } from '@principia/base/HashSet' import * as E from '@principia/base/Either' import * as HM from '@principia/base/HashMap' import * as M from '@principia/base/Maybe' export class CompletedRequestMap { constructor(private map: HashMap>) {} concat = (that: CompletedRequestMap) => { return new CompletedRequestMap( HM.mutate_(this.map, (m) => { HM.iforEach_(that.map, (k, v) => { HM.set_(m, k, v) }) }) ) } insert = (request: Request, result: E.Either): CompletedRequestMap => { return new CompletedRequestMap(HM.set_(this.map, request, result)) } contains = (request: any): boolean => { return HM.has_(this.map, request) } insertOption = (request: Request, result: E.Either>): CompletedRequestMap => { return E.match_( result, (e) => this.insert(request, E.left(e)), M.match( () => this, (a) => this.insert(request, E.right(a)) ) ) } lookup = (request: Request): M.Maybe> => { return HM.get_(this.map, request) } get requests(): HashSet { return HM.keySet(this.map) } static empty(): CompletedRequestMap { return new CompletedRequestMap(HM.makeDefault()) } }