aboutsummaryrefslogtreecommitdiff
path: root/js/src/Main.purs
blob: a16b2cdeb8e273aaca4eca1ddf2f5971d6587408 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
module Main (main) where

import Control.Monad.Eff (Eff)
import Data.Array (catMaybes) as Array
import Data.Maybe (Maybe(..))
import Data.Traversable (sequence, sequence_) as Traversable
import DOM (DOM)
import DOM.Node.ParentNode (QuerySelector(..))
import DOM.Node.Types (elementToNode) as DOM
import DOM.Node.Types (Node)
import Prelude

import Dom (selectElement, selectElements, onInput, setValue, selectElementFrom) as Dom
import EditableNumber (NumberElem)
import EditableNumber (set) as EditableNumber
import Number (format) as Number
import Parser (number) as Parser

main :: forall e. Eff (dom :: DOM | e) Unit
main = do
  tagElems <- getNumberElements
  numberElems <- Array.catMaybes <$> (Traversable.sequence $ map EditableNumber.set tagElems)
  Traversable.sequence_ $ map (onInput numberElems) numberElems

getNumberElements :: forall e. Eff (dom :: DOM | e) (Array { tag :: String, node :: Node })
getNumberElements = do
  let fromElem tag elem = { tag: tag, node: DOM.elementToNode elem }
  h1 <- map (fromElem "h1") <$> Dom.selectElement (QuerySelector "h1")
  lis <- map (fromElem "li") <$> Dom.selectElements (QuerySelector "ul > li")
  pure $ (maybeToArray h1 <> lis)

onInput :: forall e. Array NumberElem -> NumberElem -> Eff (dom :: DOM | e) Unit
onInput numberElems { elem, number } = do
  Dom.onInput elem (\value -> do
    case Parser.number value of
      Just newNumber ->
        numberElems
          # map (\ne -> do
              inputNode <- Dom.selectElementFrom ne.elem (QuerySelector "input")
              case inputNode of
                Just node -> Dom.setValue (Number.format (ne.number / number * newNumber)) node
                _ -> pure unit
            )
          # Traversable.sequence_
      _ ->
        pure unit
  )

maybeToArray :: forall a. Maybe a -> Array a
maybeToArray (Just x) = [ x ]
maybeToArray _ = []