Add link to tutorial in .cabal file
[darcs-mirrors/vector.git] / HACKS
1 [Eq and Ord instances]
2 ======================
3
4 This is what they should look like:
5
6 instance (..., Eq a) => Eq (Vector a) where
7   {-# INLINE (==) #-}
8   (==) = Data.Vector.Generic.eq
9
10 instance (..., Ord a) => Ord (Vector a) where
11   {-# INLINE compare #-}
12   compare = Data.Vector.Generic.cmp
13
14 This works fine with 6.13 but result in atrocious code with 6.12 which
15 essentially ignores the INLINE pragma. The workaround is this:
16
17 instance (..., Eq a) => Eq (Vector a) where
18   {-# INLINE (==) #-}
19   xs == ys = Stream.eq (G.stream xs) (G.stream ys)
20
21   {-# INLINE (/=) #-}
22   xs /= ys = not (Stream.eq (G.stream xs) (G.stream ys))
23
24 instance (..., Ord a) => Ord (Vector a) where
25   {-# INLINE compare #-}
26   compare xs ys = Stream.cmp (G.stream xs) (G.stream ys)
27
28   {-# INLINE (<) #-}
29   xs < ys = Stream.cmp (G.stream xs) (G.stream ys) == LT
30
31   {-# INLINE (<=) #-}
32   xs <= ys = Stream.cmp (G.stream xs) (G.stream ys) /= GT
33
34   {-# INLINE (>) #-}
35   xs > ys = Stream.cmp (G.stream xs) (G.stream ys) == GT
36
37   {-# INLINE (>=) #-}
38   xs >= ys = Stream.cmp (G.stream xs) (G.stream ys) /= LT
39
40 Ugly, but it works. This also requires the package (but not necessarily the
41 clients!) to be compiled with -fno-method-sharing.
42