--- /dev/null
+import "./Tuple3d"
+
+import "JavaBuiltin" as Java
+
+importJava "javax.vecmath.Vector3d" where
+ // Immutable mapping
+ data Vector3d
+
+ dot :: Vector3d -> Vector3d -> Double
+
+ length :: Vector3d -> Double
+ lengthSquared :: Vector3d -> Double
+
+ angle :: Vector3d -> Vector3d -> Double
+
+ @JavaName "<init>"
+ createVector3d :: Double -> Double -> Double -> Vector3d
+ @JavaName "<init>"
+ copyVector3d' :: Tuple3d -> Vector3d
+ @JavaName "<init>"
+ defaultVector3d :: Vector3d
+
+ // Mutable mapping
+ data MVector3d
+
+ @JavaName cross
+ crossM :: MVector3d -> Vector3d -> Vector3d -> <Proc> ()
+
+ @JavaName normalize
+ normalizeM :: MVector3d -> <Proc> ()
+
+ @JavaName normalize
+ normalizeM2 :: MVector3d -> Vector3d -> <Proc> ()
+
+ @JavaName dot
+ dotM :: MVector3d -> MVector3d -> <Proc> Double
+
+ @JavaName length
+ lengthM :: MVector3d -> <Proc> Double
+ @JavaName lengthSquared
+ lengthSquaredM :: MVector3d -> <Proc> Double
+
+ @JavaName angle
+ angleM :: MVector3d -> MVector3d -> <Proc> Double
+
+ @JavaName "<init>"
+ createMVector3d :: Double -> Double -> Double -> <Proc> MVector3d
+ @JavaName "<init>"
+ copyMVector3d' :: Tuple3d -> <Proc> MVector3d
+ @JavaName "<init>"
+ defaultMVector3d :: <Proc> MVector3d
+
+@private
+applyMOp :: (MVector3d -> <Proc> ()) -> (<Proc> MVector3d) -> Vector3d
+applyMOp op gen = runProc let
+ z = gen
+ op z
+ in freeze z
+
+normalize :: Vector3d -> Vector3d
+normalize v = applyMOp normalizeM (copyMVector3d (asTuple v))
+
+cross :: Vector3d -> Vector3d -> Vector3d
+cross x y = applyMOp (\z -> crossM z x y) defaultMVector3d
+
+freeze :: MVector3d -> <Proc> Vector3d
+freeze = Java.unsafeCoerce
+
+instance Tuple3dClass Vector3d
+
+copyVector3d :: Tuple3dClass a => a -> Vector3d
+copyVector3d = copyVector3d' . asTuple
+
+copyMVector3d :: Tuple3dClass a => a -> <Proc> MVector3d
+copyMVector3d = copyMVector3d' . asTuple