perf(core): replace Array.forEach loops

This commit is contained in:
braks
2024-02-05 07:51:12 +01:00
committed by Braks
parent 66d7198a2f
commit c4b4a04aa0
9 changed files with 57 additions and 42 deletions
+4 -4
View File
@@ -40,15 +40,15 @@ export class Storage {
const reactiveState = reactive(state) const reactiveState = reactive(state)
const hooksOn = <any>{} const hooksOn = <any>{}
Object.entries(reactiveState.hooks).forEach(([n, h]) => { for (const [n, h] of Object.entries(reactiveState.hooks)) {
const name = `on${n.charAt(0).toUpperCase() + n.slice(1)}` const name = `on${n.charAt(0).toUpperCase() + n.slice(1)}`
hooksOn[name] = h.on hooksOn[name] = h.on
}) }
const emits = <any>{} const emits = <any>{}
Object.entries(reactiveState.hooks).forEach(([n, h]) => { for (const [n, h] of Object.entries(reactiveState.hooks)) {
emits[n] = h.trigger emits[n] = h.trigger
}) }
// for lookup purposes // for lookup purposes
const nodeIds = computed(() => reactiveState.nodes.map((n) => n.id)) const nodeIds = computed(() => reactiveState.nodes.map((n) => n.id))
@@ -285,7 +285,7 @@ export function useWatchProps(
'autoConnect', 'autoConnect',
] ]
Object.keys(props).forEach((key) => { for (const key of Object.keys(props)) {
const propKey = key as keyof typeof props const propKey = key as keyof typeof props
if (!skip.includes(propKey)) { if (!skip.includes(propKey)) {
const propValue = toRef(() => props[propKey]) const propValue = toRef(() => props[propKey])
@@ -306,7 +306,7 @@ export function useWatchProps(
}) })
} }
} }
}) }
} }
const runAll = () => { const runAll = () => {
@@ -20,15 +20,21 @@ const markers = computed(() => {
} else { } else {
markers.push({ id: markerId, color: defaultColor, type: marker as MarkerType }) markers.push({ id: markerId, color: defaultColor, type: marker as MarkerType })
} }
ids.push(markerId) ids.push(markerId)
} }
} }
} }
;[connectionLineOptions.markerEnd, connectionLineOptions.markerStart].forEach(createMarkers) for (const marker of [connectionLineOptions.markerEnd, connectionLineOptions.markerStart]) {
createMarkers(marker)
}
edges.reduce<MarkerProps[]>((markers, edge) => { edges.reduce<MarkerProps[]>((markers, edge) => {
;[edge.markerStart, edge.markerEnd].forEach(createMarkers) for (const marker of [edge.markerStart, edge.markerEnd]) {
createMarkers(marker)
}
return markers.sort((a, b) => a.id.localeCompare(b.id)) return markers.sort((a, b) => a.id.localeCompare(b.id))
}, markers) }, markers)
+18 -18
View File
@@ -110,7 +110,7 @@ export function useActions(
const updateNodePositions: Actions['updateNodePositions'] = (dragItems, changed, dragging) => { const updateNodePositions: Actions['updateNodePositions'] = (dragItems, changed, dragging) => {
const changes: NodePositionChange[] = [] const changes: NodePositionChange[] = []
dragItems.forEach((node) => { for (const node of dragItems) {
const change: Partial<NodePositionChange> = { const change: Partial<NodePositionChange> = {
id: node.id, id: node.id,
type: 'position', type: 'position',
@@ -132,7 +132,7 @@ export function useActions(
} }
changes.push(change as NodePositionChange) changes.push(change as NodePositionChange)
}) }
if (changes?.length) { if (changes?.length) {
state.hooks.nodesChange.trigger(changes) state.hooks.nodesChange.trigger(changes)
@@ -485,8 +485,8 @@ export function useActions(
} }
const removeNodes: Actions['removeNodes'] = (nodes, removeConnectedEdges = true, removeChildren = false) => { const removeNodes: Actions['removeNodes'] = (nodes, removeConnectedEdges = true, removeChildren = false) => {
let nodesToRemove = nodes instanceof Function ? nodes(state.nodes) : nodes const nextNodes = nodes instanceof Function ? nodes(state.nodes) : nodes
nodesToRemove = Array.isArray(nodesToRemove) ? nodesToRemove : [nodesToRemove] const nodesToRemove = Array.isArray(nextNodes) ? nextNodes : [nextNodes]
const nodeChanges: NodeRemoveChange[] = [] const nodeChanges: NodeRemoveChange[] = []
const edgeChanges: EdgeRemoveChange[] = [] const edgeChanges: EdgeRemoveChange[] = []
@@ -519,21 +519,21 @@ export function useActions(
createEdgeRemovalChanges(children) createEdgeRemovalChanges(children)
} }
children.forEach((child) => { for (const child of children) {
createChildrenRemovalChanges(child.id) createChildrenRemovalChanges(child.id)
}) }
} }
} }
nodesToRemove.forEach((item) => { for (const item of nodesToRemove) {
const currNode = typeof item === 'string' ? findNode(item) : item const currNode = typeof item === 'string' ? findNode(item) : item
if (!currNode) { if (!currNode) {
return continue
} }
if (isDef(currNode.deletable) && !currNode.deletable) { if (isDef(currNode.deletable) && !currNode.deletable) {
return continue
} }
nodeChanges.push(createNodeRemoveChange(currNode.id)) nodeChanges.push(createNodeRemoveChange(currNode.id))
@@ -545,7 +545,7 @@ export function useActions(
if (removeChildren) { if (removeChildren) {
createChildrenRemovalChanges(currNode.id) createChildrenRemovalChanges(currNode.id)
} }
}) }
if (edgeChanges.length) { if (edgeChanges.length) {
state.hooks.edgesChange.trigger(edgeChanges) state.hooks.edgesChange.trigger(edgeChanges)
@@ -557,20 +557,20 @@ export function useActions(
} }
const removeEdges: Actions['removeEdges'] = (edges) => { const removeEdges: Actions['removeEdges'] = (edges) => {
let edgesToRemove = edges instanceof Function ? edges(state.edges) : edges const nextEdges = edges instanceof Function ? edges(state.edges) : edges
edgesToRemove = Array.isArray(edgesToRemove) ? edgesToRemove : [edgesToRemove] const edgesToRemove = Array.isArray(nextEdges) ? nextEdges : [nextEdges]
const changes: EdgeRemoveChange[] = [] const changes: EdgeRemoveChange[] = []
edgesToRemove.forEach((item) => { for (const item of edgesToRemove) {
const currEdge = typeof item === 'string' ? findEdge(item) : item const currEdge = typeof item === 'string' ? findEdge(item) : item
if (!currEdge) { if (!currEdge) {
return continue
} }
if (isDef(currEdge.deletable) && !currEdge.deletable) { if (isDef(currEdge.deletable) && !currEdge.deletable) {
return continue
} }
changes.push( changes.push(
@@ -582,7 +582,7 @@ export function useActions(
currEdge.targetHandle, currEdge.targetHandle,
), ),
) )
}) }
state.hooks.edgesChange.trigger(changes) state.hooks.edgesChange.trigger(changes)
} }
@@ -777,14 +777,14 @@ export function useActions(
} }
} }
Object.keys(opts).forEach((o) => { for (const o of Object.keys(opts)) {
const key = o as keyof State const key = o as keyof State
const option = opts[key] const option = opts[key]
if (![...skip, ...exclude].includes(key) && isDef(option)) { if (![...skip, ...exclude].includes(key) && isDef(option)) {
;(<any>state)[key] = option ;(<any>state)[key] = option
} }
}) }
until(() => state.d3Zoom) until(() => state.d3Zoom)
.not.toBeNull() .not.toBeNull()
+6 -2
View File
@@ -35,7 +35,9 @@ export function useGetters(state: State, nodeIds: ComputedRef<string[]>, edgeIds
const keys = Object.keys(edgeTypes) const keys = Object.keys(edgeTypes)
state.edges?.forEach((e) => e.type && !keys.includes(e.type) && (edgeTypes[e.type] = e.type)) for (const e of state.edges) {
e.type && !keys.includes(e.type) && (edgeTypes[e.type] = e.type)
}
return edgeTypes return edgeTypes
}) })
@@ -48,7 +50,9 @@ export function useGetters(state: State, nodeIds: ComputedRef<string[]>, edgeIds
const keys = Object.keys(nodeTypes) const keys = Object.keys(nodeTypes)
state.nodes?.forEach((n) => n.type && !keys.includes(n.type) && (nodeTypes[n.type] = n.type)) for (const n of state.nodes) {
n.type && !keys.includes(n.type) && (nodeTypes[n.type] = n.type)
}
return nodeTypes return nodeTypes
}) })
+5 -4
View File
@@ -145,13 +145,14 @@ function defaultState(): State {
export function useState(opts?: FlowOptions): State { export function useState(opts?: FlowOptions): State {
const state = defaultState() const state = defaultState()
if (opts) { if (opts) {
Object.keys(opts).forEach((o) => { for (const key of Object.keys(opts)) {
const option = opts[o as keyof typeof opts] const option = opts[key as keyof typeof opts]
if (isDef(option)) { if (isDef(option)) {
;(state as any)[o] = option ;(state as any)[key] = option
} }
}) }
} }
return state return state
+4 -4
View File
@@ -114,7 +114,7 @@ export function applyChanges<
| EdgeRemoveChange | EdgeRemoveChange
)[] )[]
addRemoveChanges.forEach((change) => { for (const change of addRemoveChanges) {
if (change.type === 'add') { if (change.type === 'add') {
const index = elements.findIndex((el) => el.id === change.item.id) const index = elements.findIndex((el) => el.id === change.item.id)
@@ -128,11 +128,11 @@ export function applyChanges<
elements.splice(index, 1) elements.splice(index, 1)
} }
} }
}) }
const elementIds = elements.map((el) => el.id) const elementIds = elements.map((el) => el.id)
elements.forEach((element) => { for (const element of elements) {
const currentChanges = changes.filter((c) => (<any>c).id === element.id) const currentChanges = changes.filter((c) => (<any>c).id === element.id)
for (const currentChange of currentChanges) { for (const currentChange of currentChanges) {
@@ -198,7 +198,7 @@ export function applyChanges<
break break
} }
} }
}) }
return elements return elements
} }
+8 -4
View File
@@ -169,11 +169,11 @@ function getConnectedElements<T extends Node = Node>(
const origin = dir === 'source' ? 'target' : 'source' const origin = dir === 'source' ? 'target' : 'source'
edges.forEach((edge) => { for (const edge of edges) {
if (edge[origin] === id) { if (edge[origin] === id) {
connectedIds.add(edge[dir]) connectedIds.add(edge[dir])
} }
}) }
return nodes.filter((n) => connectedIds.has(n.id)) return nodes.filter((n) => connectedIds.has(n.id))
} }
@@ -415,7 +415,9 @@ export function getConnectedEdges<E extends Edge>(nodesOrId: Node[] | string, ed
if (typeof nodesOrId === 'string') { if (typeof nodesOrId === 'string') {
nodeIds.add(nodesOrId) nodeIds.add(nodesOrId)
} else if (nodesOrId.length >= 1) { } else if (nodesOrId.length >= 1) {
nodesOrId.forEach((n) => nodeIds.add(n.id)) for (const n of nodesOrId) {
nodeIds.add(n.id)
}
} }
return edges.filter((edge) => nodeIds.has(edge.source) || nodeIds.has(edge.target)) return edges.filter((edge) => nodeIds.has(edge.source) || nodeIds.has(edge.target))
@@ -424,7 +426,9 @@ export function getConnectedEdges<E extends Edge>(nodesOrId: Node[] | string, ed
export function getConnectedNodes<N extends Node | { id: string } | string>(nodes: N[], edges: Edge[]) { export function getConnectedNodes<N extends Node | { id: string } | string>(nodes: N[], edges: Edge[]) {
const nodeIds = new Set() const nodeIds = new Set()
nodes.forEach((node) => nodeIds.add(typeof node === 'string' ? node : node.id)) for (const node of nodes) {
nodeIds.add(typeof node === 'string' ? node : node.id)
}
const connectedNodeIds = edges.reduce((acc, edge) => { const connectedNodeIds = edges.reduce((acc, edge) => {
if (nodeIds.has(edge.source)) { if (nodeIds.has(edge.source)) {
+2 -2
View File
@@ -101,7 +101,7 @@ export function getClosestHandle(
let closestHandles: { handle: ConnectionHandle; validHandleResult: ValidHandleResult }[] = [] let closestHandles: { handle: ConnectionHandle; validHandleResult: ValidHandleResult }[] = []
let minDistance = Number.POSITIVE_INFINITY let minDistance = Number.POSITIVE_INFINITY
handles.forEach((handle) => { for (const handle of handles) {
const distance = Math.sqrt((handle.x - pos.x) ** 2 + (handle.y - pos.y) ** 2) const distance = Math.sqrt((handle.x - pos.x) ** 2 + (handle.y - pos.y) ** 2)
if (distance <= connectionRadius) { if (distance <= connectionRadius) {
@@ -121,7 +121,7 @@ export function getClosestHandle(
minDistance = distance minDistance = distance
} }
} }
}) }
if (!closestHandles.length) { if (!closestHandles.length) {
return { handle: null, validHandleResult: defaultValidHandleResult() } return { handle: null, validHandleResult: defaultValidHandleResult() }