on 4e04eff help sign in
102 lines 2.6 kB history raw
1{-# LANGUAGE CPP #-}
2{-# LANGUAGE MagicHash #-}
3{-# LANGUAGE RankNTypes #-}
4{-# LANGUAGE RecordWildCards #-}
5{-# LANGUAGE ScopedTypeVariables #-}
6{-# LANGUAGE UnboxedTuples #-}
8#include "inline.hs"
10-- |
11-- Module : Streamly.Data.Array
12-- Copyright : (c) 2019 Composewell Technologies
13--
14-- License : BSD-3-Clause
15-- Maintainer : streamly@composewell.com
16-- Stability : experimental
17-- Portability : GHC
18--
19module Streamly.Data.Array
20 ( Array
22 -- * Construction
23 , A.fromListN
24 , A.fromList
26 -- Stream Folds
27 , fromStreamN
28 , fromStream
30 -- MonadicAPIs
31 , A.writeN
32 , A.write
34 -- * Elimination
36 , toStream
37 , toStreamRev
38 , read
40 -- * Random Access
42 -- * Folding Arrays
43 , streamFold
44 , fold
46 , A.length
47 )
48where
50import Prelude hiding (length, read)
51import Control.Monad (when)
52import Control.Monad.IO.Class (MonadIO)
53import GHC.Base (Int(..))
54import qualified GHC.Exts as Exts
56import Streamly.Streams.Serial (SerialT)
57import Streamly.Streams.StreamK.Type (IsStream)
58import Streamly.Internal.Data.Fold.Types (Fold(..))
59import Streamly.Internal.Data.Unfold.Types (Unfold(..))
60import Streamly.Internal.Data.Array (Array(..))
62import qualified Streamly.Internal.Data.Array as A
63import qualified Streamly.Streams.Prelude as P
64import qualified Streamly.Streams.StreamD as D
66{-# INLINE fromStreamN #-}
67fromStreamN :: MonadIO m => Int -> SerialT m a -> m (Array a)
68fromStreamN n m = do
69 when (n < 0) $ error "fromStreamN: negative write count specified"
70 A.fromStreamDN n $ D.toStreamD m
72{-# INLINE fromStream #-}
73fromStream :: MonadIO m => SerialT m a -> m (Array a)
74fromStream m = A.fromStreamD $ D.toStreamD m
76{-# INLINE_EARLY toStream #-}
77toStream :: (Monad m, IsStream t) => Array a -> t m a
78toStream = D.fromStreamD . A.toStreamD
80{-# INLINE_EARLY toStreamRev #-}
81toStreamRev :: (Monad m, IsStream t) => Array a -> t m a
82toStreamRev = D.fromStreamD . A.toStreamDRev
84{-# INLINE fold #-}
85fold :: forall m a b . Monad m => Fold m a b -> Array a -> m b
86fold f arr = P.runFold f (toStream arr :: SerialT m a)
88{-# INLINE streamFold #-}
89streamFold :: Monad m => (SerialT m a -> m b) -> Array a -> m b
90streamFold f arr = f (toStream arr)
92{-# INLINE_NORMAL read #-}
93read :: Monad m => Unfold m (Array a) a
94read = Unfold step inject
95 where
96 inject arr = return (arr, 0)
97 step (arr, i)
98 | i == A.length arr = return D.Stop
99 step (arr, (I# i)) =
100 return $
101 case Exts.indexArray# (array# arr) i of
102 (# x #) -> D.Yield x (arr, I# i + 1)