import CollectionProcedure from './CollectionProcedure';
import Id from '../types/Id';
/**
 * Interface for mutable, concurrent update patterns.
 * Pass in a closure which executes any number of methods on the collection.
 * @author Benedikt Arnarsson
 */
interface CoconutInterface<DocumentType> {
    /**
     * Given a function representing a set of operations on the collection and a set of ids to lock,
     * will run the function such that other collections cannot make modifications while the function runs.
     * For use in situations with multiple concurrent servers using the same database.
     * @author Benedikt Arnarsson
     * @param opts object containing all parameters
     * @param opts.idOrIdsToLock the one Id or list of Ids to lock for the procedure provided.
     * @param opts.procedure the procedure that is being wrapped in the lock-unlock calls
     * @returns the result of opts.procedure
     */
    runAtomicProcedure<Result>(opts: {
        idOrIdsToLock: Id | Id[];
        procedure: CollectionProcedure<DocumentType, Result>;
    }): Promise<Result>;
}
export default CoconutInterface;
