X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=GHC%2FPArr.hs;h=bb031c00a62397fd6f0c156cb5edea1849b3a68c;hb=567080c906535534628b1ab83a4a4425dcd4bb5e;hp=d385d849f89430b71bb1faa411f095ad80565409;hpb=9917dc299e1275a8d40df3abec52231b6d4d0fdf;p=haskell-directory.git diff --git a/GHC/PArr.hs b/GHC/PArr.hs index d385d84..bb031c0 100644 --- a/GHC/PArr.hs +++ b/GHC/PArr.hs @@ -1,11 +1,17 @@ --- $Id: PArr.hs,v 1.1 2002/02/11 17:11:12 simonmar Exp $ --- --- Copyright (c) [2001..2002] Manuel M T Chakravarty & Gabriele Keller +{-# OPTIONS_GHC -fparr #-} + +----------------------------------------------------------------------------- +-- | +-- Module : GHC.PArr +-- Copyright : (c) 2001-2002 Manuel M T Chakravarty & Gabriele Keller +-- License : see libraries/base/LICENSE +-- +-- Maintainer : Manuel M. T. Chakravarty +-- Stability : internal +-- Portability : non-portable (GHC Extensions) -- -- Basic implementation of Parallel Arrays. -- ---- DESCRIPTION --------------------------------------------------------------- --- -- This module has two functions: (1) It defines the interface to the -- parallel array extension of the Prelude and (2) it provides a vanilla -- implementation of parallel arrays that does not require to flatten the @@ -65,10 +71,8 @@ -- * We might want to add bounds checks that can be deactivated. -- -{-# OPTIONS -fno-implicit-prelude #-} - module GHC.PArr ( - [::], -- abstract + -- [::], -- Built-in syntax mapP, -- :: (a -> b) -> [:a:] -> [:b:] (+:+), -- :: [:a:] -> [:a:] -> [:a:] @@ -136,11 +140,11 @@ module GHC.PArr ( indexOfP -- :: (a -> Bool) -> [:a:] -> [:Int:] ) where -import PrelBase -import PrelST (ST(..), STRep, runST) -import PrelList -import PrelShow -import PrelRead +import Prelude + +import GHC.ST ( ST(..), STRep, runST ) +import GHC.Exts ( Int#, Array#, Int(I#), MutableArray#, newArray#, + unsafeFreezeArray#, indexArray#, writeArray# ) infixl 9 !: infixr 5 +:+ @@ -212,7 +216,7 @@ scanlP :: (a -> b -> a) -> a -> [:b:] -> [:a:] scanlP f z = fst . loop (scanEFL (flip f)) z scanl1P :: (a -> a -> a) -> [:a:] -> [:a:] -acanl1P f [::] = error "Prelude.scanl1P: empty array" +scanl1P f [::] = error "Prelude.scanl1P: empty array" scanl1P f a = fst $ loopFromTo 1 (lengthP a - 1) (scanEFL f) (a!:0) a foldrP :: (a -> b -> b) -> b -> [:a:] -> b @@ -293,7 +297,7 @@ sumP :: (Num a) => [:a:] -> a sumP = foldP (+) 0 productP :: (Num a) => [:a:] -> a -productP = foldP (*) 0 +productP = foldP (*) 1 maximumP :: (Ord a) => [:a:] -> a maximumP [::] = error "Prelude.maximumP: empty parallel array" @@ -398,7 +402,7 @@ instance Read a => Read [:a:] where -- Ideally, we would like `enumFromToP' and `enumFromThenToP' to be members of -- `Enum'. On the other hand, we really do not want to change `Enum'. Thus, -- for the moment, we hope that the compiler is sufficiently clever to --- properly fuse the following definition. +-- properly fuse the following definitions. enumFromToP :: Enum a => a -> a -> [:a:] enumFromToP x y = mapP toEnum (eftInt (fromEnum x) (fromEnum y)) @@ -410,7 +414,7 @@ enumFromThenToP x y z = mapP toEnum (efttInt (fromEnum x) (fromEnum y) (fromEnum z)) where efttInt x y z = scanlP (+) x $ - replicateP ((z - x + 1) `div` delta - 1) delta + replicateP (abs (z - x) `div` abs delta + 1) delta where delta = y - x @@ -566,7 +570,7 @@ loopFromTo from to mf start arr = runST (do -- unlike standard Haskell arrays, this value represents an -- internal error --- actually loop body of `loop' +-- actual loop body of `loop' -- -- * for this to be really efficient, it has to be translated with the -- constructor specialisation phase "SpecConstr" switched on; as of GHC 5.03