1 {-# LANGUAGE FlexibleContexts #-}
2 {-# LANGUAGE FlexibleInstances #-}
3 {-# LANGUAGE MultiParamTypeClasses #-}
4 {-# LANGUAGE ScopedTypeVariables #-}
5 {-# LANGUAGE TypeFamilies #-}
10 import Data.List (intercalate)
11 import Data.Vector.Fixed (
23 import qualified Data.Vector.Fixed as V (
30 -- * Low-dimension vector wrappers.
32 -- These wrappers are instances of 'Vector', so they inherit all of
33 -- the userful instances defined above. But, they use fixed
34 -- constructors, so you can pattern match out the individual
38 type instance Dim D1 = N1
39 instance Vector D1 a where
40 inspect (D1 x) (Fun f) = f x
44 type instance Dim D2 = N2
45 instance Vector D2 a where
46 inspect (D2 x y) (Fun f) = f x y
50 type instance Dim D3 = N3
51 instance Vector D3 a where
52 inspect (D3 x y z) (Fun f) = f x y z
55 data D4 a = D4 a a a a
56 type instance Dim D4 = N4
57 instance Vector D4 a where
58 inspect (D4 w x y z) (Fun f) = f w x y z
66 -- >>> let v1 = D2 1 2
70 (!) :: (Vector v a) => v a -> Int -> a
71 (!) v1 idx = (toList v1) !! idx
77 -- >>> let v1 = D3 1 2 3
83 (!?) :: (Vector v a) => v a -> Int -> Maybe a
85 | idx < 0 || idx >= V.length v1 = Nothing
86 | otherwise = Just $ v1 ! idx