[commit: packages/containers] develop-0.6, develop-0.6-questionable, master, zip-devel: Optimize *> and >> for Seq (22ef7de)

git at git.haskell.org git at git.haskell.org
Sun Dec 20 16:21:38 UTC 2015


Repository : ssh://git@git.haskell.org/containers

On branches: develop-0.6,develop-0.6-questionable,master,zip-devel
Link       : http://git.haskell.org/packages/containers.git/commitdiff/22ef7de71a5de7f9447f3fdcf16fa8f786cb84c0

>---------------------------------------------------------------

commit 22ef7de71a5de7f9447f3fdcf16fa8f786cb84c0
Author: David Feuer <David.Feuer at gmail.com>
Date:   Wed Nov 19 15:14:01 2014 -0500

    Optimize *> and >> for Seq
    
    Based on a discussion with Ross Paterson, use a multiplication-
    by-doubling algorithm to improve asymptotic time and space
    performance.


>---------------------------------------------------------------

22ef7de71a5de7f9447f3fdcf16fa8f786cb84c0
 Data/Sequence.hs | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/Data/Sequence.hs b/Data/Sequence.hs
index 1c4e143..2cfa9c7 100644
--- a/Data/Sequence.hs
+++ b/Data/Sequence.hs
@@ -228,11 +228,13 @@ instance Monad Seq where
     return = singleton
     xs >>= f = foldl' add empty xs
       where add ys x = ys >< f x
+    (>>) = (*>)
 
 instance Applicative Seq where
     pure = singleton
     fs <*> xs = foldl' add empty fs
       where add ys f = ys >< fmap f xs
+    xs *> ys = replicateSeq (length xs) ys
 
 instance MonadPlus Seq where
     mzero = empty
@@ -655,6 +657,19 @@ replicateM n x
   | n >= 0      = unwrapMonad (replicateA n (WrapMonad x))
   | otherwise   = error "replicateM takes a nonnegative integer argument"
 
+-- | @'replicateSeq' n xs@ concatenates @n@ copies of @xs at .
+replicateSeq :: Int -> Seq a -> Seq a
+replicateSeq n xs
+  | n < 0     = error "replicateSeq takes a nonnegative integer argument"
+  | n == 0    = empty
+  | otherwise = go n xs
+  where
+    -- Invariant: k >= 1
+    go 1 xs = xs
+    go k xs | even k    = kxs
+            | otherwise = xs >< kxs
+            where kxs = go (k `quot` 2) $! (xs >< xs)
+
 -- | /O(1)/. Add an element to the left end of a sequence.
 -- Mnemonic: a triangle with the single element at the pointy end.
 (<|)            :: a -> Seq a -> Seq a



More information about the ghc-commits mailing list