id	summary	reporter	owner	description	type	status	priority	milestone	version	resolution	keywords	cc
12	Simplify Eq and Ord instances	rl		"We can simplify them when we drop support for GHC 6.12.

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. This also requires the package (but not necessarily the
clients!) to be compiled with -fno-method-sharing.
"	task	new	trivial					
