All files / src/pages/flowsheet-page/flowsheet/Canvas/streamTracking state.ts

21.73% Statements 5/23
0% Branches 0/12
0% Functions 0/8
25% Lines 5/20

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91                                                                                                                  136x           136x   136x                         136x           136x            
import { MAX_TRACKED_STREAMS, TRACKED_FLOW_STYLES } from "./constants";
import type {
  TrackedStreamEdgeFlow,
  TrackedStreamState,
  TrackedStreamSummary,
} from "./types";
 
type TrackedStreamFlowResult = {
  sourceStreamId: number;
  streamIds?: number[];
};
 
export function nextTrackedFlowStyle(trackedStreams: TrackedStreamState[]) {
  const usedAccents = new Set(trackedStreams.map((flow) => flow.accent));
  return (
    TRACKED_FLOW_STYLES.find((style) => !usedAccents.has(style.accent)) ??
    TRACKED_FLOW_STYLES[trackedStreams.length % TRACKED_FLOW_STYLES.length]
  );
}
 
export function upsertTrackedStream(
  trackedStreams: TrackedStreamState[],
  trackedFlow: TrackedStreamFlowResult,
  sourceName: string,
) {
  const trackedStreamIndex = trackedStreams.findIndex(
    (stream) => stream.sourceStreamId === trackedFlow.sourceStreamId,
  );
  if (
    trackedStreamIndex === -1 &&
    trackedStreams.length >= MAX_TRACKED_STREAMS
  ) {
    return trackedStreams;
  }
 
  const trackedFlowStyle =
    trackedStreamIndex === -1
      ? nextTrackedFlowStyle(trackedStreams)
      : trackedStreams[trackedStreamIndex];
  const nextTrackedStream: TrackedStreamState = {
    sourceStreamId: trackedFlow.sourceStreamId,
    sourceName,
    streamIds: trackedFlow.streamIds ?? [],
    accent: trackedFlowStyle.accent,
    animationDelay: trackedFlowStyle.animationDelay,
  };
 
  if (trackedStreamIndex === -1) {
    return [...trackedStreams, nextTrackedStream];
  }
 
  return trackedStreams.map((stream, index) =>
    index === trackedStreamIndex ? nextTrackedStream : stream,
  );
}
 
export function buildTrackedStreamIds(trackedStreams: TrackedStreamState[]) {
  return new Set(trackedStreams.flatMap((flow) => flow.streamIds));
}
 
export function buildTrackedFlowsByStreamId(
  trackedStreams: TrackedStreamState[],
) {
  const flowsByStreamId = new Map<number, TrackedStreamEdgeFlow[]>();
 
  trackedStreams.forEach((flow, order) => {
    flow.streamIds.forEach((streamId) => {
      const streamFlows = flowsByStreamId.get(streamId) ?? [];
      streamFlows.push({
        sourceStreamId: flow.sourceStreamId,
        accent: flow.accent,
        animationDelay: flow.animationDelay,
        order,
      });
      flowsByStreamId.set(streamId, streamFlows);
    });
  });
 
  return flowsByStreamId;
}
 
export function buildTrackedStreamSummaries(
  trackedStreams: TrackedStreamState[],
): TrackedStreamSummary[] {
  return trackedStreams.map((flow) => ({
    sourceStreamId: flow.sourceStreamId,
    sourceName: flow.sourceName,
    accent: flow.accent,
  }));
}