{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} ----------------------------------------------------------------------------- -- | -- Module : Miso.Event.Decoder -- Copyright : (C) 2016-2017 David M. Johnson -- License : BSD3-style (see the file LICENSE) -- Maintainer : David M. Johnson -- Stability : experimental -- Portability : non-portable ---------------------------------------------------------------------------- module Miso.Event.Decoder ( -- * Decoder Decoder (..) , at -- * Decoders , emptyDecoder , keycodeDecoder , checkedDecoder , valueDecoder ) where import Data.Aeson.Types import Control.Applicative import Miso.Event.Types import Miso.String -- | Decoder data type for parsing events data Decoder a = Decoder { decoder :: Value -> Parser a -- ^ FromJSON-based Event decoder , decodeAt :: [MisoString] -- ^ Location in DOM of where to decode } -- | Smart constructor for building at :: [MisoString] -> (Value -> Parser a) -> Decoder a at decodeAt decoder = Decoder {..} -- | Empty decoder for use with events like "click" that do not -- return any meaningful values emptyDecoder :: Decoder () emptyDecoder = mempty `at` go where go = withObject "emptyDecoder" $ \_ -> pure () -- | Retrieves either "keyCode", "which" or "charCode" field in `Decoder` keycodeDecoder :: Decoder KeyCode keycodeDecoder = Decoder {..} where decodeAt = mempty decoder = withObject "event" $ \o -> KeyCode <$> (o .: "keyCode" <|> o .: "which" <|> o .: "charCode") -- | Retrieves "value" field in `Decoder` valueDecoder :: Decoder MisoString valueDecoder = Decoder {..} where decodeAt = ["target"] decoder = withObject "target" $ \o -> o .: "value" -- | Retrieves "checked" field in Decoder checkedDecoder :: Decoder Checked checkedDecoder = Decoder {..} where decodeAt = ["target"] decoder = withObject "target" $ \o -> Checked <$> (o .: "checked")