{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
module THREE.Vector3
(
Vector3 (..)
, THREE.Vector3.new
, vector3ToXYZ
, setXYZ
) where
import Control.Monad (void)
import Miso hiding (new)
import THREE.Internal as THREE
newtype Vector3
= Vector3
{ Vector3 -> JSVal
unVector3 :: JSVal
} deriving (Vector3 -> IO Object
(Vector3 -> IO Object) -> ToObject Vector3
forall a. (a -> IO Object) -> ToObject a
$ctoObject :: Vector3 -> IO Object
toObject :: Vector3 -> IO Object
ToObject, Vector3 -> IO JSVal
(Vector3 -> IO JSVal) -> ToJSVal Vector3
forall a. (a -> IO JSVal) -> ToJSVal a
$ctoJSVal :: Vector3 -> IO JSVal
toJSVal :: Vector3 -> IO JSVal
ToJSVal, Vector3 -> IO [JSVal]
(Vector3 -> IO [JSVal]) -> ToArgs Vector3
forall args. (args -> IO [JSVal]) -> ToArgs args
$ctoArgs :: Vector3 -> IO [JSVal]
toArgs :: Vector3 -> IO [JSVal]
ToArgs, ToObject Vector3
Property Vector3 Double
ToObject Vector3 => Property Vector3 Double -> X Vector3
forall object.
ToObject object =>
Property object Double -> X object
$cx :: Property Vector3 Double
x :: Property Vector3 Double
X, ToObject Vector3
Property Vector3 Double
ToObject Vector3 => Property Vector3 Double -> Y Vector3
forall object.
ToObject object =>
Property object Double -> Y object
$cy :: Property Vector3 Double
y :: Property Vector3 Double
Y, ToObject Vector3
Property Vector3 Double
ToObject Vector3 => Property Vector3 Double -> Z Vector3
forall object.
ToObject object =>
Property object Double -> Z object
$cz :: Property Vector3 Double
z :: Property Vector3 Double
Z)
instance FromJSVal Vector3 where
fromJSVal :: JSVal -> IO (Maybe Vector3)
fromJSVal = Maybe Vector3 -> IO (Maybe Vector3)
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Vector3 -> IO (Maybe Vector3))
-> (JSVal -> Maybe Vector3) -> JSVal -> IO (Maybe Vector3)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector3 -> Maybe Vector3
forall a. a -> Maybe a
Just (Vector3 -> Maybe Vector3)
-> (JSVal -> Vector3) -> JSVal -> Maybe Vector3
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JSVal -> Vector3
Vector3
new :: Double -> Double -> Double -> THREE.Three Vector3
new :: Double -> Double -> Double -> IO Vector3
new Double
x_ Double
y_ Double
z_ = (JSVal -> Vector3)
-> MisoString -> (Double, Double, Double) -> IO Vector3
forall args con.
ToArgs args =>
(JSVal -> con) -> MisoString -> args -> Three con
THREE.new JSVal -> Vector3
Vector3 MisoString
"Vector3" (Double
x_, Double
y_, Double
z_)
setXYZ :: Double -> Double -> Double -> Vector3 -> THREE.Three ()
setXYZ :: Double -> Double -> Double -> Vector3 -> Three ()
setXYZ Double
x_ Double
y_ Double
z_ (Vector3 JSVal
v) =
IO JSVal -> Three ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (IO JSVal -> Three ()) -> IO JSVal -> Three ()
forall a b. (a -> b) -> a -> b
$ JSVal
v JSVal -> MisoString -> (Double, Double, Double) -> IO JSVal
forall object args.
(ToObject object, ToArgs args) =>
object -> MisoString -> args -> IO JSVal
# (MisoString
"set" :: MisoString) ((Double, Double, Double) -> IO JSVal)
-> (Double, Double, Double) -> IO JSVal
forall a b. (a -> b) -> a -> b
$ (Double
x_, Double
y_, Double
z_)
vector3ToXYZ :: Vector3 -> IO (Double, Double, Double)
vector3ToXYZ :: Vector3 -> IO (Double, Double, Double)
vector3ToXYZ (Vector3 JSVal
v) = do
x_ <- JSVal -> IO Double
forall a. FromJSVal a => JSVal -> IO a
fromJSValUnchecked (JSVal -> IO Double) -> IO JSVal -> IO Double
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< JSVal
v JSVal -> MisoString -> IO JSVal
forall o. ToObject o => o -> MisoString -> IO JSVal
! (MisoString
"x" :: MisoString)
y_ <- fromJSValUnchecked =<< v ! ("y" :: MisoString)
z_ <- fromJSValUnchecked =<< v ! ("z" :: MisoString)
pure (x_, y_, z_)
instance Triplet Vector3 where
triplet :: Vector3 -> IO JSVal
triplet (Vector3 JSVal
j) = JSVal -> IO JSVal
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure JSVal
j