packages feed

jsdom-extras-0.1.0.0: src/JSDOM/Extras/Object.hs

{-|
  Description:
    Constructing and manipulating javascript objects
-}
{-# Language ConstraintKinds #-}
module JSDOM.Extras.Object where

import Control.Monad
import Language.Javascript.JSaddle

type ToJSObject k v = (ToJSString k, ToJSVal v)

-- | Turn a single key, value pair into a javascript object
singleton
  :: (ToJSObject a b, MonadJSM m)
  => a
  -> b
  -> m Object
singleton k v = toObject [(k, v)]

-- | Turn a set of key, value pairs into a javascript object
toObject
  :: (MonadJSM m, ToJSObject a b)
  => [(a, b)]
  -> m Object
toObject args = liftJSM $ do
  o <- create
  let mk (k, v) = do
        v' <- toJSVal v
        setProp (toJSString k) v' o
  mapM_ mk args
  pure o

-- | Turns a javascript Object into a list of keys and values
fromObject
  :: MonadJSM m
  => Object
  -> m [(JSString, JSVal)]
fromObject o = liftJSM $ do
  keys <- listProps o
  forM keys $ \k -> do
    v <- unsafeGetProp k o
    pure (k, v)

-- | A function that does nothing
doNothing :: JSCallAsFunction
doNothing = fun $ \_ _ _ -> pure ()

-- | Lookup a key in an object. Treats both @null@s and @undefined@s as
-- 'Nothing'
lookup
  :: MonadJSM m
  => JSString
  -> Object
  -> m (Maybe JSVal)
lookup k o = liftJSM $ toMaybe =<< getProp k o

-- | Wraps a javascript value in 'Maybe', treating @undefined@ and @null@ as
-- 'Nothing'
toMaybe :: MonadJSM m => JSVal -> m (Maybe JSVal)
toMaybe a = liftJSM $ do
  resultIsUndefined <- valIsUndefined a
  resultIsNull <- valIsNull a
  pure $ if resultIsUndefined || resultIsNull then Nothing else Just a