@@ -5,6 +5,8 @@ import Data.Array (foldMap, intercalate)
5import Data.Array as A
5import Data.Array as A
6import Data.Either (Either(..))
6import Data.Either (Either(..))
7import Data.Foldable (foldl, for_)
7import Data.Foldable (foldl, for_)
8+import Data.Lens (over, (%~))
9+import Data.Lens.Index (ix)
8import Data.Maybe (Maybe(..), fromMaybe, fromMaybe')
10import Data.Maybe (Maybe(..), fromMaybe, fromMaybe')
9import Data.Monoid (guard)
11import Data.Monoid (guard)
10import Data.String (Pattern(..), split)
12import Data.String (Pattern(..), split)
@@ -14,6 +16,7 @@ import Data.String.Regex as Regex
14import Data.String.Regex.Flags as RegexFlags
16import Data.String.Regex.Flags as RegexFlags
15import Data.String.Regex.Unsafe (unsafeRegex)
17import Data.String.Regex.Unsafe (unsafeRegex)
16import Data.Tuple.Nested ((/\))
18import Data.Tuple.Nested ((/\))
19+import Debug.Trace (spy)
17import Effect (Effect)
20import Effect (Effect)
18import Effect.Aff (launchAff_)
21import Effect.Aff (launchAff_)
19import Effect.Class (liftEffect)
22import Effect.Class (liftEffect)
@@ -70,24 +73,32 @@ complete arr = foldl f true (join arr)
70 Hole _ s -> s /= ""
73 Hole _ s -> s /= ""
76+visibleRange ∷ Array (Array Segment) -> { end ∷ Int, start ∷ Int }
77+visibleRange arr = { start, end }
79+ start = A.findIndex (_ == [ Start ]) arr ?|| 0
80+ end = A.findIndex (_ == [ End ]) arr ?|| A.length arr
73renderSegments ∷ ReactComponent InlineCode.Props -> ((Array (Array Segment) -> Array (Array Segment)) -> Effect Unit) -> Array (Array Segment) -> JSX
82renderSegments ∷ ReactComponent InlineCode.Props -> ((Array (Array Segment) -> Array (Array Segment)) -> Effect Unit) -> Array (Array Segment) -> JSX
74−renderSegments ic update arrs = R.div_ (A.mapWithIndex renderLine (onlyVisible arrs))
83+renderSegments ic update arrs = R.div_ (A.mapWithIndex renderLine arrs)
76− onlyVisible arr = A.slice start end arr
85+ { start, end } = visibleRange arrs
78− start = A.findIndex (_ == [ Start ]) arr ?|| 0
79− end = A.findIndex (_ == [ End ]) arr ?|| A.length arr
80 renderLine i l = R.div_ (A.mapWithIndex (renderSegment i) l)
86 renderLine i l = R.div_ (A.mapWithIndex (renderSegment i) l)
81− renderSegment i j = case _ of
87+ renderSegment i j s =
88+ if between start end i then case s of
82− Filler s -> R.code_ [ R.text s ]
89+ Filler s' -> R.code_ [ R.text s' ]
83− Hole width _ -> element ic $ justifill { width, onSubmit: \v -> update (updateSegments i j (S.trim v)) }
94+ , onSubmit: update <<< updateSegments i j
84− _ -> mempty
96+ _ -> mempty
86updateSegments ∷ Int -> Int -> String -> Array (Array Segment) -> Array (Array Segment)
100updateSegments ∷ Int -> Int -> String -> Array (Array Segment) -> Array (Array Segment)
87−updateSegments i j v arrs = fromMaybe [] (A.modifyAt i (updateLine j v) arrs)
101+updateSegments i j v = (ix (spy "i" i) <<< ix (spy "j" j)) %~ f
89−updateLine ∷ Int -> String -> Array Segment -> Array Segment
90−updateLine idx v arr = fromMaybe [] (A.modifyAt idx f arr)
92 f = case _ of
103 f = case _ of
93 Hole h _ -> Hole h v
104 Hole h _ -> Hole h v
@@ -146,10 +157,10 @@ mkFillInTheGaps fetch = do
146 , jsx button
157 , jsx button
147 { onClick: handler_ onClick
158 { onClick: handler_ onClick
148 , buttonType:
159 , buttonType:
149− -- if complete segments
160+ if complete (spy "segsm" segments) then
151− HighlightedButton
161+ HighlightedButton
152− -- else DisabledButton
162+ else
154 [ R.text "Try it" ]
165 [ R.text "Try it" ]
@@ -160,7 +171,7 @@ mkFillInTheGaps fetch = do
160 Right { stdout }
171 Right { stdout }
161 | stdout == expectedResult -> "Hooray!"
172 | stdout == expectedResult -> "Hooray!"
162 Left l -> "Does not compile"
173 Left l -> "Does not compile"
163− Right _ -> "Not " <> (findResult (join segments))
174+ Right _ -> "Not " <> (findResult (spy "segs" $ join segments))
165 [ R.text $ compileResultToString result ]
176 [ R.text $ compileResultToString result ]