import type { ProcessSankeyNodeData } from "./algorithm";
export interface MassHistoryRow {
    t: number;
    total: number;
}
export interface MassHistoryRowMarked extends MassHistoryRow {
    /** "min" | "q25" | "median" | "q75" | "max" — present only when the
     *  full series was condensed via `pickMassQuantiles`. */
    mark?: string;
}
/**
 * Distinct (time, total-mass) tuples drawn from a node's sample series.
 * The same `(t, total)` pair never appears twice — the layout's
 * same-time pre/post sample collapse is preserved here. Returns an
 * empty array when `data` has no samples (or is undefined).
 */
export declare function massHistoryRows(data: ProcessSankeyNodeData | undefined): MassHistoryRow[];
/** Number of quantile picks emitted on truncation. Fixed at five —
 *  `min`, `q25`, `median`, `q75`, `max` — because the picks are
 *  semantic (named labels), not cap-driven. The `truncateAt` parameter
 *  on `pickMassQuantiles` controls *when* to truncate, not how many to
 *  return. */
export declare const QUANTILE_PICK_COUNT = 5;
/**
 * Condense a row series down to the five mass-quantile picks —
 * `min`, `q25`, `median`, `q75`, `max` — re-sorted by time so the
 * tooltip table reads chronologically. Returns the input unchanged
 * when its length is at or below `truncateAt` (default 5).
 *
 * Same-time collisions are deduplicated, so very small or very flat
 * series may yield fewer than five output rows even when truncation
 * fires; the marks attached are the first ones encountered for each
 * surviving timestamp, which keeps `min` and `max` stable when ties
 * are present.
 *
 * Note: `truncateAt` is the *trigger threshold*, not the output cap —
 * once truncation fires, the output always emits the five quantile
 * picks. To raise/lower the threshold without changing the picks,
 * pass a different `truncateAt`; to vary the picks, fork this util.
 */
export declare function pickMassQuantiles(rows: MassHistoryRow[], truncateAt?: number): MassHistoryRowMarked[];
