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,,,,,
