sized-vector 1.2.0.0 → 1.3.0.0
raw patch · 3 files changed
+54/−10 lines, 3 filesdep +constraintsdep +criteriondep +paralleldep ~basedep ~deepseqdep ~equational-reasoning
Dependencies added: constraints, criterion, parallel, progression, sized-vector
Dependency ranges changed: base, deepseq, equational-reasoning, type-natural
Files
- Data/Vector/Sized.hs +7/−6
- bench/coercion.hs +29/−0
- sized-vector.cabal +18/−4
Data/Vector/Sized.hs view
@@ -165,21 +165,23 @@ -- | 'reverse' @xs@ returns the elements of xs in reverse order. @xs@ must be finite. reverse :: forall a n. Vector a n -> Vector a n-reverse xs0 = case plusZR (sLength xs0) of Refl -> go Nil xs0+reverse xs0 = coerce (plusZR (sLength xs0)) $ go Nil xs0 where go :: Vector a m -> Vector a k -> Vector a (k :+ m) go acc Nil = acc- go acc (x :- xs) = case plusSR (sLength xs) (sLength acc) of Refl -> go (x:- acc) xs+ go acc (x :- xs) = coerce (symmetry $ plusSR (sLength xs) (sLength acc)) $ go (x:- acc) xs -- | The 'intersperse' function takes an element and a vector and -- \`intersperses\' that element between the elements of the vector. intersperse :: a -> Vector a n -> Vector a ((Two :* n) :- One) intersperse _ Nil = Nil-intersperse a (x :- xs) = case plusSR (sLength xs) (sLength xs) of Refl -> x :- prependToAll a xs+intersperse a (x :- xs) =+ coerce (plusSR (sLength xs) (sLength xs)) $ x :- prependToAll a xs prependToAll :: a -> Vector a n -> Vector a (Two :* n) prependToAll _ Nil = Nil-prependToAll a (x :- xs) = case plusSR (sLength xs) (sLength xs) of Refl -> x :- a :- prependToAll a xs+prependToAll a (x :- xs) =+ x :- (coerce (plusSR (sLength xs) (sLength xs)) $ a :- prependToAll a xs) -- | The 'transpose' function transposes the rows and columns of its argument. transpose :: SingRep n => Vector (Vector a n) m -> Vector (Vector a m) n@@ -230,8 +232,7 @@ concat (xs :- xss) = let n = sLength xs n0 = sLength xss- in case plusCommutative (n0 %* n) n of- Refl -> xs `append` concat xss+ in coerce (symmetry $ plusCommutative (n0 %* n) n) $ xs `append` concat xss and, or :: Vector Bool m -> Bool -- | 'and' returns the conjunction of a Boolean vector.
+ bench/coercion.hs view
@@ -0,0 +1,29 @@+{-# LANGUAGE QuasiQuotes #-}+module Main where+import Control.DeepSeq+import Control.Parallel.Strategies+import Criterion+import Data.Type.Natural+import qualified Data.Vector.Sized as V+import Progression.Main+import System.Environment++main :: IO ()+main = do+ name : rest <- getArgs+ v10 <- return $!! ((V.replicate [snat|10|] ()) `using` rdeepseq)+ v100 <- return $!! ((V.replicate [snat|100|] ()) `using` rdeepseq)+ v200 <- return $!! ((V.replicate [snat|200|] ()) `using` rdeepseq)+ withArgs (("-n"++name) : rest) $+ defaultMain $+ bgroup "bench" [ bgroup "reverse"+ [ bench "10" $ nf V.reverse v10+ , bench "100" $ nf V.reverse v100+ , bench "1000" $ nf V.reverse v200+ ]+ , bgroup "intersperse"+ [ bench "10" $ nf (V.intersperse ()) v10+ , bench "100" $ nf (V.intersperse ()) v100+ , bench "200" $ nf (V.intersperse ()) v200+ ]+ ]
sized-vector.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: sized-vector-version: 1.2.0.0+version: 1.3.0.0 synopsis: Size-parameterized vector types and functions. description: Size-parameterized vector types and functions using a data-type promotion. homepage: https://github.com/konn/sized-vector@@ -21,10 +21,24 @@ library exposed-modules: Data.Vector.Sized- build-depends: base >= 2.0 && < 5+ build-depends: base >= 2.0 && < 5 , singletons == 0.8.*- , type-natural >= 0.0.4.0+ , type-natural == 0.1.*+ , constraints , monomorphic == 0.0.*- , equational-reasoning == 0.0.*+ , equational-reasoning >= 0.0.3 && < 0.1 , hashable == 1.1.* , deepseq == 1.3.*++Benchmark coercion-bench+ type: exitcode-stdio-1.0+ main-is: coercion.hs+ hs-source-dirs: bench+ ghc-options: -O2 -threaded -fcontext-stack=500+ build-depends: criterion+ , progression+ , sized-vector+ , base+ , type-natural+ , parallel+ , deepseq