diff options
-rw-r--r-- | compiler/typecheck/TcDerivUtils.hs | 2 | ||||
-rw-r--r-- | compiler/utils/Outputable.hs | 4 | ||||
-rw-r--r-- | compiler/utils/Util.hs | 11 |
3 files changed, 13 insertions, 4 deletions
diff --git a/compiler/typecheck/TcDerivUtils.hs b/compiler/typecheck/TcDerivUtils.hs index 5f48e5f003..32a7aca922 100644 --- a/compiler/typecheck/TcDerivUtils.hs +++ b/compiler/typecheck/TcDerivUtils.hs @@ -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] diff --git a/compiler/utils/Outputable.hs b/compiler/utils/Outputable.hs index bb3b9d3177..b3d77aa843 100644 --- a/compiler/utils/Outputable.hs +++ b/compiler/utils/Outputable.hs @@ -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 diff --git a/compiler/utils/Util.hs b/compiler/utils/Util.hs index 0c7bb4a189..876cd1ee6e 100644 --- a/compiler/utils/Util.hs +++ b/compiler/utils/Util.hs @@ -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 |