-type Vec = V3 Integer
-data Planet = Planet { _pos :: Vec, _vel :: Vec} deriving (Show, Eq, Ord)
-type Planets = S.Set Planet
+-- data Vec3 = Vec3 (V3 Integer) deriving (Show, Eq, Ord)
+-- data Vec1 = Vec1 (V1 Integer) deriving (Show, Eq, Ord)
+class (Ord a) => NVec a where
+ (^+^^) :: a -> a -> a
+ (^-^^) :: a -> a -> a
+ nvZero :: a
+ nvSignum :: a -> a
+ nvAbsSum :: a -> Integer
+instance NVec (V1 Integer) where
+ x ^+^^ y = x ^+^ y
+ x ^-^^ y = x ^-^ y
+ nvZero = V1 0
+ nvSignum (V1 x) = V1 (signum x)
+ nvAbsSum (V1 x) = abs x
+instance NVec (V3 Integer) where
+ x ^+^^ y = x ^+^ y
+ x ^-^^ y = x ^-^ y
+ nvZero = V3 0 0 0
+ nvSignum (V3 x y z) = V3 (signum x) (signum y) (signum z)
+ nvAbsSum (V3 x y z) = (abs x) + (abs y) + (abs z)
+
+
+-- data Vec = Vec1 (V1 Integer) | Vec3 (V3 Integer)
+-- deriving (Show, Eq, Ord)
+-- data Planet1 = Planet { _pos :: (V1 Integer), _vel :: (V1 Integer)} deriving (Show, Eq, Ord)
+data Planet a = Planet { _pos :: a , _vel :: a} deriving (Show, Eq, Ord)
+-- type Planets1 = S.Set Planet1
+type Planets a = S.Set (Planet a)