Replace a few uses of snocView with last/lastMaybe.
authorklebinger.andreas@gmx.at <klebinger.andreas@gmx.at>
Mon, 21 Jan 2019 16:55:22 +0000 (17:55 +0100)
committerMarge Bot <ben+marge-bot@smart-cactus.org>
Sat, 9 Feb 2019 17:22:13 +0000 (12:22 -0500)
These never used the first part of the result from snocView.
Hence replacing them with last[Maybe] is both clearer and
gives better performance.

compiler/typecheck/TcDerivUtils.hs
compiler/utils/Outputable.hs
compiler/utils/Util.hs

index 5f48e5f..32a7aca 100644 (file)
@@ -801,7 +801,7 @@ cond_functorOK allowFunctions allowExQuantifiedLastTyVar _ _ rep_tc
   = allValid (map check_con data_cons)
   where
     tc_tvs            = tyConTyVars rep_tc
-    Just (_, last_tv) = snocView tc_tvs
+    last_tv           = last tc_tvs
     bad_stupid_theta  = filter is_bad (tyConStupidTheta rep_tc)
     is_bad pred       = last_tv `elemVarSet` exactTyCoVarsOfType pred
       -- See Note [Check that the type variable is truly universal]
index bb3b9d3..b3d77aa 100644 (file)
@@ -609,8 +609,8 @@ quotes d =
       else SDoc $ \sty ->
            let pp_d = runSDoc d sty
                str  = show pp_d
-           in case (str, snocView str) of
-             (_, Just (_, '\'')) -> pp_d
+           in case (str, lastMaybe str) of
+             (_, Just '\'') -> pp_d
              ('\'' : _, _)       -> pp_d
              _other              -> Pretty.quotes pp_d
 
index 0c7bb4a..876cd1e 100644 (file)
@@ -28,7 +28,7 @@ module Util (
         mapAndUnzip, mapAndUnzip3, mapAccumL2,
         nOfThem, filterOut, partitionWith,
 
-        dropWhileEndLE, spanEnd, last2,
+        dropWhileEndLE, spanEnd, last2, lastMaybe,
 
         foldl1', foldl2, count, countWhile, all2,
 
@@ -779,6 +779,15 @@ last2 = foldl' (\(_,x2) x -> (x2,x)) (partialError,partialError)
   where
     partialError = panic "last2 - list length less than two"
 
+lastMaybe :: [a] -> Maybe a
+lastMaybe [] = Nothing
+lastMaybe xs = Just $ last xs
+
+-- | If there is a good chance that you will only look at the last
+-- element prefer seperate calls to @last@ + @init@.
+-- @last@ does not allocate while traversing the list, while this
+-- will. But if you are guaranteed to use both this will
+-- usually be more efficient.
 snocView :: [a] -> Maybe ([a],a)
         -- Split off the last element
 snocView [] = Nothing