[commit: packages/containers] master: Fix warnings. (2bdc5f3)
git at git.haskell.org
git at git.haskell.org
Fri Dec 18 22:10:41 UTC 2015
Repository : ssh://git@git.haskell.org/containers
On branch : master
Link : http://git.haskell.org/packages/containers.git/commitdiff/2bdc5f38f740f43b49bad0a53c81b9d4a25a56bd
>---------------------------------------------------------------
commit 2bdc5f38f740f43b49bad0a53c81b9d4a25a56bd
Author: Milan Straka <fox at ucw.cz>
Date: Mon Dec 15 22:47:28 2014 +0100
Fix warnings.
In getNodes, pass (a, [a]) instead of an [a] which we know is nonempty.
This way we do not have to create void pattern-match case for empty
list.
Also use STRICT_x_OF_y macros instead of `seq`-ing in every
pattern-match case.
>---------------------------------------------------------------
2bdc5f38f740f43b49bad0a53c81b9d4a25a56bd
Data/Sequence.hs | 40 ++++++++++++++++++++++++----------------
1 file changed, 24 insertions(+), 16 deletions(-)
diff --git a/Data/Sequence.hs b/Data/Sequence.hs
index 9a23f77..1f19c62 100644
--- a/Data/Sequence.hs
+++ b/Data/Sequence.hs
@@ -183,7 +183,6 @@ import Data.Data
-- Array stuff, with GHC.Arr on GHC
import Data.Array (Ix, Array)
-import qualified Data.Array
#ifdef __GLASGOW_HASKELL__
import qualified GHC.Arr
#endif
@@ -200,6 +199,15 @@ import qualified GHC.Exts
import Data.Functor.Identity (Identity(..))
#endif
+
+-- Use macros to define strictness of functions.
+-- STRICT_x_OF_y denotes an y-ary function strict in the x-th parameter.
+-- We do not use BangPatterns, because they are not in any standard and we
+-- want the compilers to be compiled by as many compilers as possible.
+#define STRICT_1_OF_2(fn) fn arg _ | arg `seq` False = undefined
+#define STRICT_1_OF_3(fn) fn arg _ _ | arg `seq` False = undefined
+
+
infixr 5 `consTree`
infixl 5 `snocTree`
@@ -1783,27 +1791,27 @@ findIndicesR p xs = foldlWithIndex g [] xs
-- There is a function 'toList' in the opposite direction for all
-- instances of the 'Foldable' class, including 'Seq'.
fromList :: [a] -> Seq a
-fromList xs = Seq $ mkTree 1 $ map_elem xs
+fromList = Seq . mkTree 1 . map_elem
where
{-# SPECIALIZE mkTree :: Int -> [Elem a] -> FingerTree (Elem a) #-}
{-# SPECIALIZE mkTree :: Int -> [Node a] -> FingerTree (Node a) #-}
mkTree :: (Sized a) => Int -> [a] -> FingerTree a
- mkTree s [] = s `seq` Empty
- mkTree s [x1] = s `seq` Single x1
+ STRICT_1_OF_2(mkTree)
+ mkTree _ [] = Empty
+ mkTree _ [x1] = Single x1
mkTree s [x1, x2] = Deep (2*s) (One x1) Empty (One x2)
mkTree s [x1, x2, x3] = Deep (3*s) (One x1) Empty (Two x2 x3)
- mkTree s (x1:x2:x3:xs) = s `seq` case getNodes (3*s) xs of
- (ns, sf) -> m `seq` deep' (Three x1 x2 x3) m sf
- where m = mkTree (3*s) ns
-
- deep' pr@(Three x1 _ _) m sf = Deep (3*size x1 + size m + size sf) pr m sf
-
- getNodes :: Int -> [a] -> ([Node a], Digit a)
- getNodes s [x1] = s `seq` ([], One x1)
- getNodes s [x1, x2] = s `seq` ([], Two x1 x2)
- getNodes s [x1, x2, x3] = s `seq` ([], Three x1 x2 x3)
- getNodes s (x1:x2:x3:xs) = s `seq` (Node3 s x1 x2 x3:ns, d)
- where (ns, d) = getNodes s xs
+ mkTree s (x1:x2:x3:x4:xs) = case getNodes (3*s) x4 xs of
+ (ns, sf) -> case mkTree (3*s) ns of
+ m -> m `seq` Deep (3*size x1 + size m + size sf) (Three x1 x2 x3) m sf
+
+ getNodes :: Int -> a -> [a] -> ([Node a], Digit a)
+ STRICT_1_OF_3(getNodes)
+ getNodes _ x1 [] = ([], One x1)
+ getNodes _ x1 [x2] = ([], Two x1 x2)
+ getNodes _ x1 [x2, x3] = ([], Three x1 x2 x3)
+ getNodes s x1 (x2:x3:x4:xs) = (Node3 s x1 x2 x3:ns, d)
+ where (ns, d) = getNodes s x4 xs
map_elem :: [a] -> [Elem a]
#if __GLASGOW_HASKELL__ >= 708
More information about the ghc-commits
mailing list