N2,
N3,
N4,
+ S,
Vector(..),
construct,
+ fromList,
inspect,
toList,
)
-- constructors, so you can pattern match out the individual
-- components.
-data D1 a = D1 a
+data D1 a = D1 a deriving (Show, Eq)
type instance Dim D1 = N1
instance Vector D1 a where
inspect (D1 x) (Fun f) = f x
construct = Fun D1
-data D2 a = D2 a a
+data D2 a = D2 a a deriving (Show, Eq)
type instance Dim D2 = N2
instance Vector D2 a where
inspect (D2 x y) (Fun f) = f x y
construct = Fun D2
-data D3 a = D3 a a a
+data D3 a = D3 a a a deriving (Show, Eq)
type instance Dim D3 = N3
instance Vector D3 a where
inspect (D3 x y z) (Fun f) = f x y z
construct = Fun D3
-data D4 a = D4 a a a a
+data D4 a = D4 a a a a deriving (Show, Eq)
type instance Dim D4 = N4
instance Vector D4 a where
inspect (D4 w x y z) (Fun f) = f w x y z
(!?) v1 idx
| idx < 0 || idx >= V.length v1 = Nothing
| otherwise = Just $ v1 ! idx
+
+
+-- | Remove an element of the given vector.
+--
+-- Examples:
+--
+-- >>> let b = D3 1 2 3
+-- >>> delete b 1 :: D2 Int
+-- D2 1 3
+--
+delete :: (Vector v a, Vector w a, Dim v ~ S (Dim w)) => v a -> Int -> w a
+delete v1 idx =
+ fromList $ (lhalf ++ rhalf')
+ where
+ (lhalf, rhalf) = splitAt idx (toList v1)
+ rhalf' = tail rhalf