/**
 * Flowtype definitions for profile
 * Generated by Flowgen from a Typescript Definition
 * Flowgen v1.11.0
 * @flow
 */

import { KeyedSet } from "./utils";
import { ValueFormatter } from "./value-formatters";
import type { FileFormat$ValueUnit } from "./file-format-spec";
export interface FrameInfo {
  key: string | number;
  name: string;
  file?: string;
  line?: number;
  col?: number;
}
declare export class HasWeights {
  getSelfWeight(): number;
  getTotalWeight(): number;
  addToTotalWeight(delta: number): void;
  addToSelfWeight(delta: number): void;
  overwriteWeightWith(other: HasWeights): void;
}
declare export class Frame mixins HasWeights {
  key: string | number;
  name: string;
  file?: string;
  line?: number;
  col?: number;
  constructor(): this;
  static root: Frame;
  static getOrInsert(set: KeyedSet<Frame>, info: FrameInfo): Frame;
}
declare export class CallTreeNode mixins HasWeights {
  +frame: Frame;
  +parent: CallTreeNode | null;
  children: CallTreeNode[];
  isRoot(): boolean;
  isFrozen(): boolean;
  freeze(): void;
  constructor(frame: Frame, parent: CallTreeNode | null): this;
}
export interface ProfileGroup {
  name: string;
  indexToView: number;
  profiles: Profile[];
}
declare export class Profile {
  name: string;
  totalWeight: number;
  frames: KeyedSet<Frame>;
  appendOrderCalltreeRoot: CallTreeNode;
  groupedCalltreeRoot: CallTreeNode;
  getAppendOrderCalltreeRoot(): CallTreeNode;
  getGroupedCalltreeRoot(): CallTreeNode;
  samples: CallTreeNode[];
  weights: number[];
  valueFormatter: ValueFormatter;
  constructor(totalWeight?: number): this;
  formatValue(v: number): string;
  setValueFormatter(f: ValueFormatter): void;
  getWeightUnit(): FileFormat$ValueUnit;
  getName(): string;
  setName(name: string): void;
  getTotalWeight(): number;
  getTotalNonIdleWeight(): number;
  sortGroupedCallTree(): void;
  forEachCallGrouped(
    openFrame: (node: CallTreeNode, value: number) => void,
    closeFrame: (node: CallTreeNode, value: number) => void
  ): void;
  forEachCall(
    openFrame: (node: CallTreeNode, value: number) => void,
    closeFrame: (node: CallTreeNode, value: number) => void
  ): void;
  forEachFrame(fn: (frame: Frame) => void): void;
  getProfileWithRecursionFlattened(): Profile;
  getInvertedProfileForCallersOf(focalFrameInfo: FrameInfo): Profile;
  getProfileForCalleesOf(focalFrameInfo: FrameInfo): Profile;
  demangle(): Promise<void>;
  remapNames(callback: (name: string) => string): void;
}
declare export class StackListProfileBuilder mixins Profile {
  _appendSample(
    stack: FrameInfo[],
    weight: number,
    useAppendOrder: boolean
  ): void;
  appendSampleWithWeight(stack: FrameInfo[], weight: number): void;
  appendSampleWithTimestamp(stack: FrameInfo[], timestamp: number): void;
  build(): Profile;
}
declare export class CallTreeProfileBuilder mixins Profile {
  enterFrame(frameInfo: FrameInfo, value: number): void;
  leaveFrame(frameInfo: FrameInfo, value: number): void;
  build(): Profile;
}
