Overhaul INLINE and INLINABLE in Map and Set.
authorMilan Straka <fox@ucw.cz>
Fri, 25 Nov 2011 14:55:06 +0000 (15:55 +0100)
committerMilan Straka <fox@ucw.cz>
Mon, 28 Nov 2011 11:04:06 +0000 (12:04 +0100)
commit3f798e333509f02eb44d39a41068c76863064097
tree6ff6fbad825aaa43625b0084a4a52bfc596c763c
parent64d4433d0cb0b444c48a4f1f6b7374144cfbd9f1
Overhaul INLINE and INLINABLE in Map and Set.

* Rename INLINEABLE -> INLINABLE
  Though both work, the latter is the preferred according the docs.

* Remove INLINABLE on methods not using type classes, as INLINABLE has
  real effect only on functions that use type classes (they get
  specialised in the call-site module).

  It also allows worker-wrapper transform on functions not marked
  INLINABLE (which surprisingly did not happen with INLINABLE).

* In GHC, INLINing the INLINABLE method as in
    update f = updateWithKey (\_ x -> f x)
    {-# INLINE update #-}
    updateWithKey = ...
    {-# INLINABLE updateWithKey #-}
  does not produce wanted result -- the updateWithKey does not get
  specialized in the call-site module.

  The solution is to mark both functions INLINABLE.

* Mark trivial functions as INLINE.
Data/Map/Base.hs
Data/Map/Strict.hs
Data/Set.hs