-import Linear (V3(..), (^+^), (^-^))
-
-import qualified Data.Set as S
-
--- import Data.List (foldl')
--- import Data.Set ((\\))
--- import qualified Data.Map.Strict as M
--- import Data.Map.Strict ((!))
-
-
-type Vec = V3 Integer
-data Planet = Planet { _pos :: Vec, _vel :: Vec} deriving (Show, Eq, Ord)
-type Planets = S.Set Planet
+import Linear (V3(..), V1(..), (^+^), (^-^))
+
+import qualified Data.Vector as V
+
+class (Eq 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 Planet a = Planet { _pos :: a , _vel :: a} deriving (Show, Eq, Ord)
+type Planets a = V.Vector (Planet a)