export type BranchCompareOidResult = { ok: true; oid: string } | { ok: false; error: unknown } type BranchCompareHeadReaders = { readCompareRef: () => Promise resolveBaseRef: () => Promise readHeadOid: () => Promise readBaseOid: (resolvedBaseRef: string) => Promise } export type BranchCompareHead = { compareRef: string resolvedBaseRef: string headOidResult: BranchCompareOidResult baseOidResult: BranchCompareOidResult } function settleOid(read: Promise): Promise { return read.then( (oid) => ({ ok: true as const, oid }), (error) => ({ ok: false as const, error }) ) } export async function readBranchCompareHead( readers: BranchCompareHeadReaders ): Promise { const compareRefPromise = readers.readCompareRef() const resolvedBaseRefPromise = readers.resolveBaseRef() const headOidResultPromise = settleOid(readers.readHeadOid()) const baseOidResultPromise = resolvedBaseRefPromise.then((resolvedBaseRef) => settleOid(readers.readBaseOid(resolvedBaseRef)) ) const [compareRef, resolvedBaseRef, headOidResult, baseOidResult] = await Promise.all([ compareRefPromise, resolvedBaseRefPromise, headOidResultPromise, baseOidResultPromise ]) return { compareRef, resolvedBaseRef, headOidResult, baseOidResult } }