import { MergeAllBranchesFn, CommitDoc, DocAndMetadata, } from './TrimergeClientOptions'; import { mergeHeads, SortRefsFn } from './merge-heads'; export type MergeResult = { temp?: boolean; } & DocAndMetadata; export type MergeDocFn = ( base: CommitDoc | undefined, left: CommitDoc, right: CommitDoc, ) => MergeResult; export function makeMergeAllBranchesFn( sortRefs: SortRefsFn, merge: MergeDocFn, ): MergeAllBranchesFn { return (headRefs, { addMerge, getCommitInfo, computeLatestDoc }) => { mergeHeads( headRefs, sortRefs, getCommitInfo, (baseRef, leftRef, rightRef) => { const migratedBase = baseRef !== undefined ? computeLatestDoc(baseRef) : undefined; const migratedLeft = computeLatestDoc(leftRef); const migratedRight = computeLatestDoc(rightRef); const { doc, metadata, temp = true, } = merge(migratedBase, migratedLeft, migratedRight); return addMerge( doc, metadata, temp, migratedLeft.ref, migratedRight.ref, ); }, ); }; }