2-- Module : Streamly.String
3-- Copyright : (c) 2018 Composewell Technologies
6-- Maintainer : harendra.kumar@gmail.com
7-- Stability : experimental
10-- Stream of 'Char' are the equivalent of Haskell Strings but without any
11-- performance issues that are usually associated with the 'String' type.
12-- Haskell lists are not suitable for storage in GC memory. We use streams for
13-- processing and arrays for storing. We can use the usual stream processing
14-- routines on these 'Char' streams. Stream processing is very efficient due to
15-- stream fusion. If strings are to be stored or buffered in memory, they can
16-- be encoded to 'Word8' arrays using the encoding routines provided in the
17-- module. Therefore, a separate type for text representation is not required.
19-- The 'String' type in this module is just a synonym for the type @List Char@.
20-- It provides better performance compared to the standard Haskell @String@
21-- type and can be used almost as a drop-in replacement, especially when used
22-- with @OverloadedStrings@ extension, with little differences.
24-- See "Streamly.List", <src/docs/streamly-vs-lists.md> for more details and
25-- <src/test/PureStreams.hs> for comprehensive usage examples.
27-- TBD write a note on performance comparison with text, bytestrings, lists and
34 -- * Encoding and Decoding
36 , encodeChar8Unchecked
42 -- * Unicode aware operations
48 -- * Operations on character strings
49 , strip -- (dropAround isSpace)
63import Data.Word (Word8)
64import GHC.Base (unsafeChr)
65import Streamly (IsStream)
66-- import Streamly.List (List)
67import Prelude hiding (String, lines, words, unlines, unwords)
68-- import Streamly.Fold (Fold)
69-- import Streamly.Array (Array)
71import qualified Streamly.Prelude as S
73-- type String = List Char
75-------------------------------------------------------------------------------
76-- Encoding/Decoding Characters
77-------------------------------------------------------------------------------
79-- decodeWith :: TextEncoding -> t m Word8 -> t m Char
80-- decodeWith = undefined
82-------------------------------------------------------------------------------
83-- Encoding/Decoding Unicode Characters
84-------------------------------------------------------------------------------
86-- | Decode a stream of bytes to Unicode characters by mapping each byte to a
87-- corresponding Unicode 'Char' in 0-255 range.
88decodeChar8 :: (IsStream t, Monad m) => t m Word8 -> t m Char
89decodeChar8 = S.map (unsafeChr . fromIntegral)
91-- | Encode a stream of Unicode characters to bytes by mapping each character
92-- to a byte in 0-255 range. Throws an error if the input stream contains
93-- characters beyond 255.
94encodeChar8 :: (IsStream t, Monad m) => t m Char -> t m Word8
95encodeChar8 = S.map convert
100 then error $ "Streamly.String.encodeChar8 invalid \
101 \input char codepoint " ++ show codepoint
102 else fromIntegral codepoint
104-- | Like 'encodeChar8' but silently truncates and maps input characters beyond
105-- 255 to (incorrect) chars in 0-255 range. No error or exception is thrown
106-- when such truncation occurs.
107encodeChar8Unchecked :: (IsStream t, Monad m) => t m Char -> t m Word8
108encodeChar8Unchecked = S.map (fromIntegral . ord)
111-- | Decode a UTF-8 encoded bytestream to a stream of Unicode characters.
112decodeUtf8 :: IsStream t => t m Word8 -> t m Char
113decodeUtf8 = undefined
115-- | Encode a stream of Unicode characters to a UTF-8 encoded bytestream.
116encodeUtf8 :: IsStream t => t m Char -> t m Word8
117encodeUtf8 = undefined
119-------------------------------------------------------------------------------
120-- Unicode aware operations on strings
121-------------------------------------------------------------------------------
123toCaseFold :: IsStream t => t m Char -> t m Char
124toCaseFold = undefined
126toLower :: IsStream t => t m Char -> t m Char
129toUpper :: IsStream t => t m Char -> t m Char
132toTitle :: IsStream t => t m Char -> t m Char
135-------------------------------------------------------------------------------
136-- Utility operations on strings
137-------------------------------------------------------------------------------
139strip :: IsStream t => t m Char -> t m Char
142stripStart :: IsStream t => t m Char -> t m Char
143stripStart = undefined
145stripEnd :: IsStream t => t m Char -> t m Char
148foldLines :: IsStream t => t m Char -> Fold m Char b -> t m b
151foldWords :: IsStream t => t m Char -> Fold m Char b -> t m b
154lines :: IsStream t => t m Char -> t m (Array Char)
157words :: IsStream t => t m Char -> t m (Array Char)
160unlines :: IsStream t => t m (Array Char) -> t m Char
163unwords :: IsStream t => t m (Array Char) -> t m Char
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