0 | module Rhone.JS.Input
 1 |
 2 | import Data.MSF
 3 | import JS
 4 | import Rhone.JS.ElemRef
 5 | import Rhone.JS.Sink
 6 | import Rhone.JS.Source
 7 | import Web.Dom
 8 | import Web.Html
 9 |
10 | fireAndHold : o -> MSF m (Event o) (HList [o, Event o])
11 | fireAndHold v = fan [hold v, id <|> once v]
12 |
13 | export
14 | input :
15 |      (getInput : ev -> Event String)
16 |   -> (read     : String -> Either String a)
17 |   -> (ref      : ElemRef HTMLInputElement)
18 |   -> MSF JSIO ev (Either String a)
19 | input get read ref =
20 |       map read . get
21 |   ^>> fireAndHold (read "")
22 |   >>> par [id, ifEvent (leftInvalid ref)]
23 |   >>> hd
24 |
25 | export
26 | getInput :
27 |      Eq ev
28 |   => ev
29 |   -> (read     : String -> Either String a)
30 |   -> (ref      : ElemRef HTMLInputElement)
31 |   -> MSF JSIO ev (Either String a)
32 | getInput e read ref =
33 |       bool (e ==)
34 |   >>> collect [valueOf ref >>^ Ev . read, never]
35 |   >>> fireAndHold (read "")
36 |   >>> par [id, ifEvent (leftInvalid ref)]
37 |   >>> hd
38 |