@@ -1,7 +1,7 @@
11module Yoga.FillInTheGaps.Component where
22
33import Prelude
4−import Data.Array (foldMap, intercalate)
4+import Data.Array (foldMap, foldr, intercalate)
55import Data.Array as A
66import Data.Either (Either(..))
77import Data.Foldable (foldl)
@@ -17,6 +17,7 @@ import Data.String.Regex as Regex
1717import Data.String.Regex.Flags as RegexFlags
1818import Data.String.Regex.Unsafe (unsafeRegex)
1919import Data.Tuple.Nested ((/\))
20+import Debug.Trace (spy)
2021import Effect (Effect)
2122import Effect.Aff (launchAff_)
2223import Effect.Class (liftEffect)
@@ -90,7 +91,7 @@ renderSegments highlighterTheme ic update arrs = R.div_ (A.mapWithIndex renderLi
9091 renderLine i l = R.div_ (A.mapWithIndex (renderSegment i) l)
9192 renderSegment i j s =
9293 if between start end i then case s of
93− Filler s' -> element syntaxHighlighterImpl { style: highlighterTheme, language: "purescript", children: s' }
94+ Filler s' -> element syntaxHighlighterImpl { style: highlighterTheme, language: "purescript", children: spy "ch" s' }
9495 Hole width _ ->
9596 element ic
9697 $ justifill
@@ -135,6 +136,20 @@ toSegment = case _ of
135136 | Regex.test endRegex x -> End
136137 other -> Filler other
137138
139+-- Glues together Filler segments
140+-- [[Filler "line1"], [Filler "line2"]] --> [[Filler "line1\nline2"]]
141+-- [[Filler "line1", Filler "line2"]] --> [[Filler "line1\nline2"]]
142+-- [[Filler "line1", Filler "line2"], [Filler "line3"]] --> [[Filler "line1\nline2\line3"]]
143+smooshFillers ∷ Array (Array Segment) -> Array (Array Segment)
144+smooshFillers = foldl smooshOuter []
145+ where
146+ smooshInner segments segment = case segment, A.unsnoc segments of
147+ Filler f, Just { init, last: Filler prev } -> A.snoc init (Filler (prev <> "\n" <> f))
148+ _, _ -> A.snoc segments segment
149+ smooshOuter acc segs = case foldl smooshInner [] segs, A.unsnoc acc of
150+ [ Filler f ], Just { init, last: [ Filler prev ] } -> A.snoc init [ Filler (prev <> "\n" <> f) ]
151+ _, _ -> A.snoc acc segs
152+
138153type Ctx r
139154 = (Compiler r)
140155
@@ -150,7 +165,7 @@ makeComponent { compileAndRun } = do
150165 let
151166 lines = split (Pattern "\n") code
152167
153− initialSegments = lines <#> \line -> rawSegments line <#> toSegment
168+ initialSegments = smooshFillers (lines <#> \line -> rawSegments line <#> toSegment)
154169 segments /\ modifySegments <- useState initialSegments
155170 result /\ modifyResult <- useState Nothing
156171 cssTheme <- useTheme