From 011390b0c0da523598da2515d9763c16d50b30fe Mon Sep 17 00:00:00 2001 From: webdevred <148627186+webdevred@users.noreply.github.com> Date: Sat, 17 Jan 2026 21:01:17 +0100 Subject: [PATCH 1/2] Optimize vertex and node processing --- src-extra/transformation/JbeamEdit/Transformation.hs | 2 +- src/JbeamEdit/Core/Node.hs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src-extra/transformation/JbeamEdit/Transformation.hs b/src-extra/transformation/JbeamEdit/Transformation.hs index b49574ca..c022ce2b 100644 --- a/src-extra/transformation/JbeamEdit/Transformation.hs +++ b/src-extra/transformation/JbeamEdit/Transformation.hs @@ -317,7 +317,7 @@ vertexForestToNodeVector initialMeta vf = oMap (_, listsOfNodes) = mapAccumL stepType initialMeta treesOrder - in V.fromList (concat listsOfNodes) + in foldMap V.fromList listsOfNodes treesOrder :: [VertexTreeType] treesOrder = [LeftTree, MiddleTree, RightTree, SupportTree] diff --git a/src/JbeamEdit/Core/Node.hs b/src/JbeamEdit/Core/Node.hs index dca96190..8a7e0bbd 100644 --- a/src/JbeamEdit/Core/Node.hs +++ b/src/JbeamEdit/Core/Node.hs @@ -121,7 +121,7 @@ possiblyChildren n = expectArray n <|> expectObject n moreNodesThanOne :: Vector Node -> Bool moreNodesThanOne v - | len == 1 = any moreNodesThanOne . possiblyChildren $ V.head v + | len == 1 = any moreNodesThanOne . possiblyChildren $ V.unsafeHead v | len > 1 = True | otherwise = False where From 74fdba1014de1f32cbf9a1486a177b81aaa0be43 Mon Sep 17 00:00:00 2001 From: webdevred <148627186+webdevred@users.noreply.github.com> Date: Tue, 10 Mar 2026 20:21:19 +0100 Subject: [PATCH 2/2] Use LBS.count to avoid intermediate list alloc in separatorParser --- src/JbeamEdit/Parsing/Jbeam.hs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/JbeamEdit/Parsing/Jbeam.hs b/src/JbeamEdit/Parsing/Jbeam.hs index 5459b37d..3c3b72f4 100644 --- a/src/JbeamEdit/Parsing/Jbeam.hs +++ b/src/JbeamEdit/Parsing/Jbeam.hs @@ -46,9 +46,8 @@ separatorParser = do comma <- MP.optional (MP.label "comma" $ byteChar ',') ws2 <- MP.takeWhileP Nothing wordIsSpace - let hasNewline = - isNothing comma && '\n' `elem` map toChar (LBS.unpack ws1) - || '\n' `elem` map toChar (LBS.unpack ws2) + let nl = toWord8 '\n' + hasNewline = isNothing comma && LBS.count nl ws1 > 0 || LBS.count nl ws2 > 0 modify (\s -> s {lastNodeEndedWithNewline = hasNewline})