@@ -3,17 +3,17 @@ module FillInTheGaps where
3import Prelude
3import Prelude
5import Data.Array as A
5import Data.Array as A
6−import Data.Maybe (Maybe(..), fromMaybe)
6+import Data.Maybe (fromMaybe)
7import Data.String (Pattern(..), split)
7import Data.String (Pattern(..), split)
8import Data.Tuple.Nested ((/\))
8import Data.Tuple.Nested ((/\))
9import Effect (Effect)
9import Effect (Effect)
10−import Effect.Unsafe (unsafePerformEffect)
11import Justifill (justifill)
10import Justifill (justifill)
12import Partial.Unsafe (unsafeCrashWith)
11import Partial.Unsafe (unsafeCrashWith)
13import React.Basic (JSX, ReactComponent, element)
12import React.Basic (JSX, ReactComponent, element)
14import React.Basic.DOM as R
13import React.Basic.DOM as R
15−import React.Basic.Hooks (ReactChildren, componentWithChildren, reactChildrenToArray, useState)
14+import React.Basic.Hooks (component, useState)
16import React.Basic.Hooks as React
15import React.Basic.Hooks as React
16+import Yoga.Helpers (intersperse)
17import Yoga.InlineCode.Component as InlineCode
17import Yoga.InlineCode.Component as InlineCode
19data Segment = Filler String | Hole String
19data Segment = Filler String | Hole String
@@ -36,19 +36,17 @@ updateLine idx v arr = fromMaybe [] (A.modifyAt idx f arr)
36 Filler s -> unsafeCrashWith "Updated a filler"
36 Filler s -> unsafeCrashWith "Updated a filler"
37 Hole _ -> Hole v
37 Hole _ -> Hole v
40−fillInTheGaps :: ReactComponent { children :: ReactChildren String }
39+mkFillInTheGaps :: Effect (ReactComponent { code :: String })
41−fillInTheGaps = unsafePerformEffect do
40+mkFillInTheGaps = do
42 ic <- InlineCode.makeComponent
41 ic <- InlineCode.makeComponent
43− componentWithChildren "InlineCodeWithChildren" \{ children } -> React.do
42+ component "FillInTheGaps" \{ code } -> React.do
45 separator = "???"
44 separator = "???"
46− child = children # reactChildrenToArray # A.head # fromMaybe "gurki"
47− lines = split (Pattern "\n") child
45+ lines = split (Pattern "\n") code
48− rawSegments = split (Pattern separator)
46+ rawSegments = split (Pattern separator) >>> intersperse separator
49 toSegment = case _ of
47 toSegment = case _ of
50 x | x == separator -> Hole ""
48 x | x == separator -> Hole ""
51 other -> Filler other
49 other -> Filler other
52 initialSegments = lines <#> \line -> rawSegments line <#> toSegment
50 initialSegments = lines <#> \line -> rawSegments line <#> toSegment
53− (segments :: Array (Array Segment)) /\ modifySegments <- useState initialSegments
51+ segments /\ modifySegments <- useState initialSegments
54 pure $ renderSegments ic (modifySegments) segments
52 pure $ renderSegments ic (modifySegments) segments