3-- Module : Streamly.Data.Array
4-- Copyright : (c) 2019 Composewell Technologies
7-- Maintainer : streamly@composewell.com
11-- Unboxed immutable arrays with streaming interfaces.
13-- Please refer to "Streamly.Internal.Data.Array" for functions that have not
16-- For arrays that work on boxed types, not requiring the 'Unbox' constraint,
17-- please refer to "Streamly.Data.Array.Generic". For arrays that can be
18-- mutated in-place, please see "Streamly.Data.MutArray".
20module Streamly.Data.Array
23 -- | To execute the code examples provided in this module in ghci, please
24 -- run the following commands first.
35 -- | When performance matters, the fastest way to generate an array is
36 -- 'writeN'. 'IsList' and 'IsString' instances can be
37 -- used to conveniently construct arrays from literal values.
38 -- 'OverloadedLists' extension or 'fromList' can be used to construct an
39 -- array from a list literal. Similarly, 'OverloadedStrings' extension or
40 -- 'fromList' can be used to construct an array from a string literal.
47 , A.writeN -- drop new
48 , A.write -- full buffer
49 , writeLastN -- drop old (ring buffer)
52 -- 'GHC.Exts.toList' from "GHC.Exts" can be used to convert an array to a
72 -- * Pinning & Unpinning
85import Streamly.Internal.Data.Unfold (Unfold)
86import Streamly.Internal.Data.Array as A hiding (read, readRev)
87import Streamly.Internal.Data.Array.Type (pin, unpin, isPinned)
89import Streamly.Internal.Data.Unbox (Unbox (..))
90import Prelude hiding (read)
92#include "DocTestDataArray.hs"
96-- This module provides APIs to create and use unboxed immutable arrays. Once
97-- created, their contents cannot be modified. Only types that are unboxable
98-- via the 'Unbox' type class can be stored in these arrays. Note that the
99-- array memory grows automatically when creating a new array, therefore, an
100-- array can be created from a variable length stream.
104-- Convert array to stream, and fold the stream:
106-- >>> fold f arr = Stream.unfold Array.reader arr & Stream.fold f
107-- >>> fold Fold.sum (Array.fromList [1,2,3::Int])
110-- == Transforming Arrays
112-- Convert array to stream, transform, and fold back to array:
114-- >>> amap f arr = Stream.unfold Array.reader arr & fmap f & Stream.fold Array.write
115-- >>> amap (+1) (Array.fromList [1,2,3::Int])
118-- == Pinned and Unpinned Arrays
120-- The array type can use both pinned and unpinned memory under the hood. The
121-- default array creation operations create unpinned arrays. IO operations
122-- automatically copy an array to pinned memory if the array passed to it is
123-- unpinned. Programmers can use appropriate pinned array generation APIs to
124-- reduce the copying if it happens.
126-- Unpinned arrays have the advantage of allowing automatic defragmentation of
127-- the memory by GC. Whereas pinned arrays have the advantage of not requiring
128-- a copy by GC. Normally you would want to use unpinned arrays. However, in
129-- some cases, for example, for long lived large data storage, and for
130-- interfacing with the operating system or foreign (non-Haskell) consumers you
131-- may want to use pinned arrays.
133-- == Creating Arrays from Non-IO Streams
135-- Array creation folds require 'MonadIO' otherwise the compiler may
136-- incorrectly share the array memory thinking it is pure.
138-- See the 'fromPureStream' unreleased API to generate an array from an
139-- Identity stream safely without using MonadIO constraint.
142-- Note that 'Identity' streams can be generalized to IO streams:
144-- >>> pure = Stream.fromList [1,2,3] :: Stream Identity Int
145-- >>> generally = Stream.morphInner (return . runIdentity)
146-- >>> Stream.fold Array.write (generally pure :: Stream IO Int)
149-- == Programming Tips
151-- This module is designed to be imported qualified:
153-- >>> import qualified Streamly.Data.Array as Array
157{-# DEPRECATED read "Please use 'reader' instead" #-}
158{-# INLINE_NORMAL read #-}
159read :: (Monad m, Unbox a) => Unfold m (Array a) a
162-- | Same as 'readerRev'
164{-# DEPRECATED readRev "Please use 'readerRev' instead" #-}
165{-# INLINE_NORMAL readRev #-}
166readRev :: (Monad m, Unbox a) => Unfold m (Array a) a
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list