packages feed

pipes-vector 0.5.3 → 0.6

raw patch · 2 files changed

+34/−25 lines, 2 filesdep ~monad-primitivedep ~primitive

Dependency ranges changed: monad-primitive, primitive

Files

pipes-vector.cabal view
@@ -1,12 +1,12 @@ name:                pipes-vector-version:             0.5.3+version:             0.6 synopsis:            Various proxies for streaming data into vectors description:         Proxies for streaming data into vectors.         license:             BSD3 license-file:        LICENSE author:              Ben Gamari maintainer:          Ben Gamari <bgamari.foss@gmail.com>--- copyright:           +copyright:           (c) 2015 Ben Gamari category:            Control build-type:          Simple cabal-version:       >=1.10@@ -16,10 +16,10 @@   exposed-modules:     Pipes.Vector   build-depends:       base >=3.0 && <5,                        transformers >= 0.2 && < 1.0,-                       primitive >=0.4 && <1.0,+                       primitive >=0.6 && <0.7,                        pipes >=4.0 && <5.0,                        vector >=0.9 && <1.0,-                       monad-primitive >= 0.1 && < 1.0+                       monad-primitive >= 0.1 && < 0.2   default-language:    Haskell2010   other-extensions:    RankNTypes, FlexibleContexts, GeneralizedNewtypeDeriving, TypeFamilies 
src/Pipes/Vector.hs view
@@ -22,14 +22,14 @@ import Control.Monad import Control.Monad.Trans.State.Strict as S import Control.Monad.Primitive-import Control.Monad.Primitive.Class+import qualified Control.Monad.Primitive.Class as MP import Pipes import Pipes.Internal (unsafeHoist) import Pipes.Lift import qualified Data.Vector.Generic as V import qualified Data.Vector.Generic.Mutable as M -data ToVectorState v e m = ToVecS { result :: V.Mutable v (PrimState (BasePrimMonad m)) e+data ToVectorState v e m = ToVecS { result :: V.Mutable v (PrimState m) e                                   , idx :: Int                                   } @@ -39,14 +39,23 @@ instance MonadTrans (ToVector v e) where     lift = TV . lift +instance PrimMonad m => PrimMonad (ToVector v e m) where+    type PrimState (ToVector v e m) = PrimState m+    primitive = lift . primitive+ -- Nasty orphan instances-instance MonadPrim m => MonadPrim (Proxy a' a b' b m) where-    type BasePrimMonad (Proxy a' a b' b m) = BasePrimMonad m-    liftPrim = lift . liftPrim+instance PrimMonad m => PrimMonad (Proxy a' a b' b m) where+    type PrimState (Proxy a' a b' b m) = PrimState m+    primitive = lift .  primitive++-- monad-primitive instances (TODO: remove these)+instance MP.MonadPrim m => MP.MonadPrim (Proxy a' a b' b m) where+    type BasePrimMonad (Proxy a' a b' b m) = MP.BasePrimMonad m+    liftPrim = lift . MP.liftPrim   -instance MonadPrim m => MonadPrim (ToVector v e m) where-    type BasePrimMonad (ToVector v e m) = BasePrimMonad m-    liftPrim = TV . liftPrim+instance MP.MonadPrim m => MP.MonadPrim (ToVector v e m) where+    type BasePrimMonad (ToVector v e m) = MP.BasePrimMonad m+    liftPrim = TV . MP.liftPrim                           maxChunkSize :: Int maxChunkSize = 8*1024*1024@@ -56,38 +65,38 @@ -- For efficient filling, the vector is grown geometrically up to a -- maximum chunk size. toVector-     :: (MonadPrim m, M.MVector (V.Mutable v) e)+     :: (PrimMonad m, M.MVector (V.Mutable v) e)      => Consumer e (ToVector v e m) r toVector = forever $ do       length <- M.length . result <$> lift (TV get)-      pos <- idx `liftM` lift (TV get)+      pos <- idx <$> lift (TV get)       lift $ TV $ when (pos >= length) $ do-          v <- result `liftM` get-          v' <- liftPrim $ M.unsafeGrow v (min length maxChunkSize)+          v <- result <$> get+          v' <- M.unsafeGrow v (min length maxChunkSize)           modify $ \(ToVecS r i) -> ToVecS v' i       r <- await       lift $ TV $ do-          v <- result `liftM` get-          liftPrim $ M.unsafeWrite v pos r+          v <- result <$> get+          M.unsafeWrite v pos r           modify $ \(ToVecS r i) -> ToVecS r (pos+1)  -- | Extract and freeze the constructed vector runToVectorP-     :: (MonadPrim m, V.Vector v e)+     :: (PrimMonad m, V.Vector v e)      => Proxy a' a b' b (ToVector v e m) r      -> Proxy a' a b' b m (v e) runToVectorP x = do-     v <- liftPrim $ M.new 10+     v <- M.new 10      s <- execStateP (ToVecS v 0) (hoist unTV x)-     frozen <- liftPrim $ V.freeze (result s)+     frozen <- V.freeze (result s)      return $ V.take (idx s) frozen -runToVector :: (MonadPrim m, V.Vector v e)+runToVector :: (PrimMonad m, V.Vector v e)             => ToVector v e m r -> m (v e) runToVector (TV a) = do-     v <- liftPrim $ M.new 10+     v <- M.new 10      s <- execStateT a (ToVecS v 0)-     frozen <- liftPrim $ V.freeze (result s)+     frozen <- V.freeze (result s)      return $ V.take (idx s) frozen  {- $usage@@ -97,6 +106,6 @@  -} -fromProducer :: (V.Vector v e, MonadPrim m) => Producer e (ToVector v e m) r -> m (v e)+fromProducer :: (V.Vector v e, PrimMonad m) => Producer e (ToVector v e m) r -> m (v e) fromProducer p = runEffect $ runToVectorP (p >-> toVector)