import "JavaBuiltin" as Java importJava "javax.vecmath.Quat4d" where // Immutable binding data Quat4d @JavaName "" createQuat4d :: Double -> Double -> Double -> Double -> Quat4d @JavaName "" copyQuat4d :: Quat4d -> Quat4d @JavaName "" defaultQuat4d :: Quat4d getX :: Quat4d -> Double getY :: Quat4d -> Double getZ :: Quat4d -> Double getW :: Quat4d -> Double // Mutable binding data MQuat4d @JavaName "" createMQuat4d :: Double -> Double -> Double -> Double -> MQuat4d @JavaName "" copyMQuat4d :: Quat4d -> MQuat4d @JavaName "" defaultMQuat4d :: MQuat4d @JavaName getX getXM :: MQuat4d -> Double @JavaName getY getYM :: MQuat4d -> Double @JavaName getZ getZM :: MQuat4d -> Double @JavaName getW getWM:: MQuat4d -> Double setX :: MQuat4d -> Double -> () setY :: MQuat4d -> Double -> () setZ :: MQuat4d -> Double -> () setW :: MQuat4d -> Double -> () @JavaName mul mulM :: MQuat4d -> Quat4d -> () @JavaName mul mulM2 :: MQuat4d -> Quat4d -> Quat4d -> () @JavaName mulInverse mulInverseM :: MQuat4d -> Quat4d -> () @JavaName mulInverse mulInverseM2 :: MQuat4d -> Quat4d -> Quat4d -> () @JavaName inverse inverseM :: MQuat4d -> () @JavaName inverse inverseM2 :: MQuat4d -> Quat4d -> () @JavaName normalize normalizeM :: MQuat4d -> () @JavaName normalize normalizeM2 :: MQuat4d -> Quat4d -> () freeze :: MQuat4d -> Quat4d freeze = Java.unsafeCoerce // Mapping of mutable operations to immutable ones @private applyMOp :: (MQuat4d -> ()) -> Quat4d -> Quat4d applyMOp op x = runProc let z = copyMQuat4d x op z in freeze z mul :: Quat4d -> Quat4d -> Quat4d mul x y = applyMOp (flip mulM y) x mulInverse :: Quat4d -> Quat4d -> Quat4d mulInverse x y = applyMOp (flip mulInverseM y) x inverse :: Quat4d -> Quat4d inverse = applyMOp inverseM normalize :: Quat4d -> Quat4d normalize = applyMOp normalizeM