import { Effects } from '../Effects' import { Manifest, PackageId } from '../osBindings' import { deepEqual } from './deepEqual' import { Watchable } from './Watchable' export class GetServiceManifest extends Watchable< Manifest | null, Mapped > { protected readonly label = 'GetServiceManifest' constructor( effects: Effects, readonly opts: { packageId: PackageId }, options?: { map?: (value: Manifest | null) => Mapped eq?: (a: Mapped, b: Mapped) => boolean }, ) { super(effects, options) } protected fetch(callback?: () => void) { return this.effects.getServiceManifest({ ...this.opts, callback }) } } export function getServiceManifest( effects: Effects, packageId: PackageId, ): GetServiceManifest export function getServiceManifest( effects: Effects, packageId: PackageId, map: (manifest: Manifest | null) => Mapped, eq?: (a: Mapped, b: Mapped) => boolean, ): GetServiceManifest export function getServiceManifest( effects: Effects, packageId: PackageId, map?: (manifest: Manifest | null) => Mapped, eq?: (a: Mapped, b: Mapped) => boolean, ): GetServiceManifest { return new GetServiceManifest( effects, { packageId }, { map: map ?? ((a) => a as Mapped), eq: eq ?? ((a, b) => deepEqual(a, b)), }, ) }