New file HACKS which explains various performance hacks in the library
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Fri, 19 Feb 2010 04:39:05 +0000 (04:39 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Fri, 19 Feb 2010 04:39:05 +0000 (04:39 +0000)
HACKS [new file with mode: 0644]

diff --git a/HACKS b/HACKS
new file mode 100644 (file)
index 0000000..a2b3c6c
--- /dev/null
+++ b/HACKS
@@ -0,0 +1,41 @@
+[Eq and Ord instances]
+======================
+
+This is what they should look like:
+
+instance (..., Eq a) => Eq (Vector a) where
+  {-# INLINE (==) #-}
+  (==) = Data.Vector.Generic.eq
+
+instance (..., Ord a) => Ord (Vector a) where
+  {-# INLINE compare #-}
+  compare = Data.Vector.Generic.cmp
+
+This works fine with 6.13 but result in atrocious code with 6.12 which
+essentially ignores the INLINE pragma. The workaround is this:
+
+instance (..., Eq a) => Eq (Vector a) where
+  {-# INLINE (==) #-}
+  xs == ys = Stream.eq (G.stream xs) (G.stream ys)
+
+  {-# INLINE (/=) #-}
+  xs /= ys = not (Stream.eq (G.stream xs) (G.stream ys))
+
+instance (..., Ord a) => Ord (Vector a) where
+  {-# INLINE compare #-}
+  compare xs ys = Stream.cmp (G.stream xs) (G.stream ys)
+
+  {-# INLINE (<) #-}
+  xs < ys = Stream.cmp (G.stream xs) (G.stream ys) == LT
+
+  {-# INLINE (<=) #-}
+  xs <= ys = Stream.cmp (G.stream xs) (G.stream ys) /= GT
+
+  {-# INLINE (>) #-}
+  xs > ys = Stream.cmp (G.stream xs) (G.stream ys) == GT
+
+  {-# INLINE (>=) #-}
+  xs >= ys = Stream.cmp (G.stream xs) (G.stream ys) /= LT
+
+Ugly, but it works.
+