packages feed

miso-css-0.0.1: src/Miso/Css/Event.hs

{-# LANGUAGE FunctionalDependencies #-}
module Miso.Css.Event where

import Miso
import Miso.Event as E
import Miso.Css.Prelude

class EventFactory ef a | ef -> a where
  eventName :: ef -> MisoString
  mkActionAttribute :: ef -> Attribute a

data AtomicEvent a = AtomicEvent MisoString a deriving (Show, Eq, Ord)

instance EventFactory (AtomicEvent a) a where
  eventName (AtomicEvent e _) = e
  mkActionAttribute (AtomicEvent e a) =
    E.on e emptyDecoder $ \() _ -> a

data VarEvent a = forall r. VarEvent MisoString (Decoder r) (r -> DOMRef -> a)

instance EventFactory (VarEvent a) a where
  eventName (VarEvent en _ _) = en
  mkActionAttribute (VarEvent en decoder af) =
    on en decoder af

onClick :: a -> AtomicEvent a
onClick = AtomicEvent "click"

onVar :: Decoder r -> MisoString -> (r -> a) -> VarEvent a
onVar d n f = VarEvent n d (\a _ -> f a)

onInput :: (MisoString -> a) -> VarEvent a
onInput = onVar valueDecoder "input"

onChange :: (MisoString -> a) -> VarEvent a
onChange = onVar valueDecoder "change"

onKeyPress :: (KeyCode -> a) -> VarEvent a
onKeyPress = onVar keycodeDecoder "keypress"

onKeyUp :: (KeyCode -> a) -> VarEvent a
onKeyUp = onVar keycodeDecoder "keyup"