{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Miso.Date
(
Date
, new
, toDateString
, toISOString
, toJSON
, toLocaleDateString
, toLocaleString
, toLocaleTimeString
, toString
, toTimeString
, toUTCString
, valueOf
, getDate
, getDay
, getFullYear
, getHours
, getMilliseconds
, getMinutes
, getMonth
, getSeconds
, getTime
, getTimezoneOffset
, getUTCDate
, getUTCDay
, getUTCFullYear
, getUTCHours
, getUTCMilliseconds
, getUTCMinutes
, getUTCMonth
, getUTCSeconds
, setDate
, setFullYear
, setHours
, setMilliseconds
, setMinutes
, setMonth
, setSeconds
, setTime
, setUTCDate
, setUTCFullYear
, setUTCHours
, setUTCMilliseconds
, setUTCMinutes
, setUTCMonth
, setUTCSeconds
) where
import Data.Maybe (catMaybes)
import Miso.DSL (jsg, JSVal, ToJSVal, FromJSVal, ToObject)
import qualified Miso.DSL as DSL
import Miso.FFI (callFunction)
import Miso.String (MisoString)
newtype Date = Date JSVal deriving (JSVal -> IO (Maybe Date)
JSVal -> IO Date
(JSVal -> IO (Maybe Date)) -> (JSVal -> IO Date) -> FromJSVal Date
forall a. (JSVal -> IO (Maybe a)) -> (JSVal -> IO a) -> FromJSVal a
$cfromJSVal :: JSVal -> IO (Maybe Date)
fromJSVal :: JSVal -> IO (Maybe Date)
$cfromJSValUnchecked :: JSVal -> IO Date
fromJSValUnchecked :: JSVal -> IO Date
FromJSVal, Date -> IO JSVal
(Date -> IO JSVal) -> ToJSVal Date
forall a. (a -> IO JSVal) -> ToJSVal a
$ctoJSVal :: Date -> IO JSVal
toJSVal :: Date -> IO JSVal
ToJSVal, Date -> IO Object
(Date -> IO Object) -> ToObject Date
forall a. (a -> IO Object) -> ToObject a
$ctoObject :: Date -> IO Object
toObject :: Date -> IO Object
ToObject, Date -> Date -> Bool
(Date -> Date -> Bool) -> (Date -> Date -> Bool) -> Eq Date
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Date -> Date -> Bool
== :: Date -> Date -> Bool
$c/= :: Date -> Date -> Bool
/= :: Date -> Date -> Bool
Eq)
new :: IO Date
new :: IO Date
new = JSVal -> Date
Date (JSVal -> Date) -> IO JSVal -> IO Date
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO JSVal -> [JSVal] -> IO JSVal
forall constructor args.
(ToObject constructor, ToArgs args) =>
constructor -> args -> IO JSVal
DSL.new (MisoString -> IO JSVal
jsg MisoString
"Date") ([] :: [JSVal])
call0 :: FromJSVal a => Date -> MisoString -> IO a
call0 :: forall a. FromJSVal a => Date -> MisoString -> IO a
call0 (Date JSVal
d) MisoString
name = JSVal -> IO a
forall a. FromJSVal a => JSVal -> IO a
DSL.fromJSValUnchecked (JSVal -> IO a) -> IO JSVal -> IO a
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< JSVal -> MisoString -> [JSVal] -> IO JSVal
forall args. ToArgs args => JSVal -> MisoString -> args -> IO JSVal
callFunction JSVal
d MisoString
name ([] :: [JSVal])
callArgs :: FromJSVal a => Date -> MisoString -> [JSVal] -> IO a
callArgs :: forall a. FromJSVal a => Date -> MisoString -> [JSVal] -> IO a
callArgs (Date JSVal
d) MisoString
name [JSVal]
args = JSVal -> IO a
forall a. FromJSVal a => JSVal -> IO a
DSL.fromJSValUnchecked (JSVal -> IO a) -> IO JSVal -> IO a
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< JSVal -> MisoString -> [JSVal] -> IO JSVal
forall args. ToArgs args => JSVal -> MisoString -> args -> IO JSVal
callFunction JSVal
d MisoString
name [JSVal]
args
toDateString :: Date -> IO MisoString
toDateString :: Date -> IO MisoString
toDateString Date
date = Date -> MisoString -> IO MisoString
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"toDateString"
toISOString :: Date -> IO MisoString
toISOString :: Date -> IO MisoString
toISOString Date
date = Date -> MisoString -> IO MisoString
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"toISOString"
toJSON :: Date -> IO MisoString
toJSON :: Date -> IO MisoString
toJSON Date
date = Date -> MisoString -> IO MisoString
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"toJSON"
toLocaleDateString :: Date -> IO MisoString
toLocaleDateString :: Date -> IO MisoString
toLocaleDateString Date
date = Date -> MisoString -> IO MisoString
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"toLocaleDateString"
toLocaleString :: Date -> IO MisoString
toLocaleString :: Date -> IO MisoString
toLocaleString Date
date = Date -> MisoString -> IO MisoString
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"toLocaleString"
toLocaleTimeString :: Date -> IO MisoString
toLocaleTimeString :: Date -> IO MisoString
toLocaleTimeString Date
date = Date -> MisoString -> IO MisoString
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"toLocaleTimeString"
toString :: Date -> IO MisoString
toString :: Date -> IO MisoString
toString Date
date = Date -> MisoString -> IO MisoString
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"toString"
toTimeString :: Date -> IO MisoString
toTimeString :: Date -> IO MisoString
toTimeString Date
date = Date -> MisoString -> IO MisoString
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"toTimeString"
toUTCString :: Date -> IO MisoString
toUTCString :: Date -> IO MisoString
toUTCString Date
date = Date -> MisoString -> IO MisoString
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"toUTCString"
valueOf :: Date -> IO Double
valueOf :: Date -> IO Double
valueOf Date
date = Date -> MisoString -> IO Double
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"valueOf"
getDate :: Date -> IO Int
getDate :: Date -> IO Int
getDate Date
date = Date -> MisoString -> IO Int
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"getDate"
getDay :: Date -> IO Int
getDay :: Date -> IO Int
getDay Date
date = Date -> MisoString -> IO Int
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"getDay"
getFullYear :: Date -> IO Int
getFullYear :: Date -> IO Int
getFullYear Date
date = Date -> MisoString -> IO Int
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"getFullYear"
getHours :: Date -> IO Int
getHours :: Date -> IO Int
getHours Date
date = Date -> MisoString -> IO Int
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"getHours"
getMilliseconds :: Date -> IO Int
getMilliseconds :: Date -> IO Int
getMilliseconds Date
date = Date -> MisoString -> IO Int
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"getMilliseconds"
getMinutes :: Date -> IO Int
getMinutes :: Date -> IO Int
getMinutes Date
date = Date -> MisoString -> IO Int
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"getMinutes"
getMonth :: Date -> IO Int
getMonth :: Date -> IO Int
getMonth Date
date = Date -> MisoString -> IO Int
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"getMonth"
getSeconds :: Date -> IO Int
getSeconds :: Date -> IO Int
getSeconds Date
date = Date -> MisoString -> IO Int
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"getSeconds"
getTime :: Date -> IO Double
getTime :: Date -> IO Double
getTime Date
date = Date -> MisoString -> IO Double
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"getTime"
getTimezoneOffset :: Date -> IO Int
getTimezoneOffset :: Date -> IO Int
getTimezoneOffset Date
date = Date -> MisoString -> IO Int
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"getTimezoneOffset"
getUTCDate :: Date -> IO Int
getUTCDate :: Date -> IO Int
getUTCDate Date
date = Date -> MisoString -> IO Int
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"getUTCDate"
getUTCDay :: Date -> IO Int
getUTCDay :: Date -> IO Int
getUTCDay Date
date = Date -> MisoString -> IO Int
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"getUTCDay"
getUTCFullYear :: Date -> IO Int
getUTCFullYear :: Date -> IO Int
getUTCFullYear Date
date = Date -> MisoString -> IO Int
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"getUTCFullYear"
getUTCHours :: Date -> IO Int
getUTCHours :: Date -> IO Int
getUTCHours Date
date = Date -> MisoString -> IO Int
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"getUTCHours"
getUTCMilliseconds :: Date -> IO Int
getUTCMilliseconds :: Date -> IO Int
getUTCMilliseconds Date
date = Date -> MisoString -> IO Int
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"getUTCMilliseconds"
getUTCMinutes :: Date -> IO Int
getUTCMinutes :: Date -> IO Int
getUTCMinutes Date
date = Date -> MisoString -> IO Int
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"getUTCMinutes"
getUTCMonth :: Date -> IO Int
getUTCMonth :: Date -> IO Int
getUTCMonth Date
date = Date -> MisoString -> IO Int
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"getUTCMonth"
getUTCSeconds :: Date -> IO Int
getUTCSeconds :: Date -> IO Int
getUTCSeconds Date
date = Date -> MisoString -> IO Int
forall a. FromJSVal a => Date -> MisoString -> IO a
call0 Date
date MisoString
"getUTCSeconds"
setDate :: Int -> Date -> IO Double
setDate :: Int -> Date -> IO Double
setDate Int
day (Date JSVal
d) = JSVal -> IO Double
forall a. FromJSVal a => JSVal -> IO a
DSL.fromJSValUnchecked (JSVal -> IO Double) -> IO JSVal -> IO Double
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< JSVal -> MisoString -> [Int] -> IO JSVal
forall args. ToArgs args => JSVal -> MisoString -> args -> IO JSVal
callFunction JSVal
d MisoString
"setDate" [Int
day]
setFullYear :: Int -> Maybe Int -> Maybe Int -> Date -> IO Double
setFullYear :: Int -> Maybe Int -> Maybe Int -> Date -> IO Double
setFullYear Int
year Maybe Int
month Maybe Int
day (Date JSVal
d) = do
y <- Int -> IO JSVal
forall a. ToJSVal a => a -> IO JSVal
DSL.toJSVal Int
year
m <- traverse DSL.toJSVal month
d' <- traverse DSL.toJSVal day
callArgs (Date d) "setFullYear" (catMaybes [Just y, m, d'])
setHours :: Int -> Maybe Int -> Maybe Int -> Maybe Int -> Date -> IO Double
setHours :: Int -> Maybe Int -> Maybe Int -> Maybe Int -> Date -> IO Double
setHours Int
hours Maybe Int
minutes Maybe Int
seconds Maybe Int
millis (Date JSVal
d) = do
h <- Int -> IO JSVal
forall a. ToJSVal a => a -> IO JSVal
DSL.toJSVal Int
hours
m <- traverse DSL.toJSVal minutes
s <- traverse DSL.toJSVal seconds
ms <- traverse DSL.toJSVal millis
callArgs (Date d) "setHours" (catMaybes [Just h, m, s, ms])
setMilliseconds :: Int -> Date -> IO Double
setMilliseconds :: Int -> Date -> IO Double
setMilliseconds Int
ms (Date JSVal
d) = JSVal -> IO Double
forall a. FromJSVal a => JSVal -> IO a
DSL.fromJSValUnchecked (JSVal -> IO Double) -> IO JSVal -> IO Double
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< JSVal -> MisoString -> [Int] -> IO JSVal
forall args. ToArgs args => JSVal -> MisoString -> args -> IO JSVal
callFunction JSVal
d MisoString
"setMilliseconds" [Int
ms]
setMinutes :: Int -> Maybe Int -> Maybe Int -> Date -> IO Double
setMinutes :: Int -> Maybe Int -> Maybe Int -> Date -> IO Double
setMinutes Int
minutes Maybe Int
seconds Maybe Int
millis (Date JSVal
d) = do
m <- Int -> IO JSVal
forall a. ToJSVal a => a -> IO JSVal
DSL.toJSVal Int
minutes
s <- traverse DSL.toJSVal seconds
ms <- traverse DSL.toJSVal millis
callArgs (Date d) "setMinutes" (catMaybes [Just m, s, ms])
setMonth :: Int -> Maybe Int -> Date -> IO Double
setMonth :: Int -> Maybe Int -> Date -> IO Double
setMonth Int
month Maybe Int
day (Date JSVal
d) = do
m <- Int -> IO JSVal
forall a. ToJSVal a => a -> IO JSVal
DSL.toJSVal Int
month
d' <- traverse DSL.toJSVal day
callArgs (Date d) "setMonth" (catMaybes [Just m, d'])
setSeconds :: Int -> Maybe Int -> Date -> IO Double
setSeconds :: Int -> Maybe Int -> Date -> IO Double
setSeconds Int
seconds Maybe Int
millis (Date JSVal
d) = do
s <- Int -> IO JSVal
forall a. ToJSVal a => a -> IO JSVal
DSL.toJSVal Int
seconds
ms <- traverse DSL.toJSVal millis
callArgs (Date d) "setSeconds" (catMaybes [Just s, ms])
setTime :: Double -> Date -> IO Double
setTime :: Double -> Date -> IO Double
setTime Double
time (Date JSVal
d) = JSVal -> IO Double
forall a. FromJSVal a => JSVal -> IO a
DSL.fromJSValUnchecked (JSVal -> IO Double) -> IO JSVal -> IO Double
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< JSVal -> MisoString -> [Double] -> IO JSVal
forall args. ToArgs args => JSVal -> MisoString -> args -> IO JSVal
callFunction JSVal
d MisoString
"setTime" [Double
time]
setUTCDate :: Int -> Date -> IO Double
setUTCDate :: Int -> Date -> IO Double
setUTCDate Int
day (Date JSVal
d) = JSVal -> IO Double
forall a. FromJSVal a => JSVal -> IO a
DSL.fromJSValUnchecked (JSVal -> IO Double) -> IO JSVal -> IO Double
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< JSVal -> MisoString -> [Int] -> IO JSVal
forall args. ToArgs args => JSVal -> MisoString -> args -> IO JSVal
callFunction JSVal
d MisoString
"setUTCDate" [Int
day]
setUTCFullYear :: Int -> Maybe Int -> Maybe Int -> Date -> IO Double
setUTCFullYear :: Int -> Maybe Int -> Maybe Int -> Date -> IO Double
setUTCFullYear Int
year Maybe Int
month Maybe Int
day (Date JSVal
d) = do
y <- Int -> IO JSVal
forall a. ToJSVal a => a -> IO JSVal
DSL.toJSVal Int
year
m <- traverse DSL.toJSVal month
d' <- traverse DSL.toJSVal day
callArgs (Date d) "setUTCFullYear" (catMaybes [Just y, m, d'])
setUTCHours :: Int -> Maybe Int -> Maybe Int -> Maybe Int -> Date -> IO Double
setUTCHours :: Int -> Maybe Int -> Maybe Int -> Maybe Int -> Date -> IO Double
setUTCHours Int
hours Maybe Int
minutes Maybe Int
seconds Maybe Int
millis (Date JSVal
d) = do
h <- Int -> IO JSVal
forall a. ToJSVal a => a -> IO JSVal
DSL.toJSVal Int
hours
m <- traverse DSL.toJSVal minutes
s <- traverse DSL.toJSVal seconds
ms <- traverse DSL.toJSVal millis
callArgs (Date d) "setUTCHours" (catMaybes [Just h, m, s, ms])
setUTCMilliseconds :: Int -> Date -> IO Double
setUTCMilliseconds :: Int -> Date -> IO Double
setUTCMilliseconds Int
ms (Date JSVal
d) = JSVal -> IO Double
forall a. FromJSVal a => JSVal -> IO a
DSL.fromJSValUnchecked (JSVal -> IO Double) -> IO JSVal -> IO Double
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< JSVal -> MisoString -> [Int] -> IO JSVal
forall args. ToArgs args => JSVal -> MisoString -> args -> IO JSVal
callFunction JSVal
d MisoString
"setUTCMilliseconds" [Int
ms]
setUTCMinutes :: Int -> Maybe Int -> Maybe Int -> Date -> IO Double
setUTCMinutes :: Int -> Maybe Int -> Maybe Int -> Date -> IO Double
setUTCMinutes Int
minutes Maybe Int
seconds Maybe Int
millis (Date JSVal
d) = do
m <- Int -> IO JSVal
forall a. ToJSVal a => a -> IO JSVal
DSL.toJSVal Int
minutes
s <- traverse DSL.toJSVal seconds
ms <- traverse DSL.toJSVal millis
callArgs (Date d) "setUTCMinutes" (catMaybes [Just m, s, ms])
setUTCMonth :: Int -> Maybe Int -> Date -> IO Double
setUTCMonth :: Int -> Maybe Int -> Date -> IO Double
setUTCMonth Int
month Maybe Int
day (Date JSVal
d) = do
m <- Int -> IO JSVal
forall a. ToJSVal a => a -> IO JSVal
DSL.toJSVal Int
month
d' <- traverse DSL.toJSVal day
callArgs (Date d) "setUTCMonth" (catMaybes [Just m, d'])
setUTCSeconds :: Int -> Maybe Int -> Date -> IO Double
setUTCSeconds :: Int -> Maybe Int -> Date -> IO Double
setUTCSeconds Int
seconds Maybe Int
millis (Date JSVal
d) = do
s <- Int -> IO JSVal
forall a. ToJSVal a => a -> IO JSVal
DSL.toJSVal Int
seconds
ms <- traverse DSL.toJSVal millis
callArgs (Date d) "setUTCSeconds" (catMaybes [Just s, ms])