1{-# LANGUAGE MagicHash #-}
2{-# LANGUAGE OverloadedStrings #-}
3
4-- | Strict @Text@. Import as:
5--
6-- > import qualified RIO.Text as T
7--
8-- This module does not export any partial functions.  For those, see
9-- "RIO.Text.Partial"
10module RIO.Text
11    (
12    -- * Types
13      Data.Text.Text
14
15    -- * Creation and elimination
16    , Data.Text.pack
17    , Data.Text.unpack
18    , Data.Text.singleton
19    , Data.Text.empty
20
21    -- * Basic interface
22    , Data.Text.cons
23    , Data.Text.snoc
24    , Data.Text.append
25    , Data.Text.uncons
26    , Data.Text.null
27    , Data.Text.length
28    , Data.Text.compareLength
29
30    -- * Transformations
31    , Data.Text.map
32    , Data.Text.intercalate
33    , Data.Text.intersperse
34    , Data.Text.transpose
35    , Data.Text.reverse
36
37    -- ** Case conversion
38    , Data.Text.toCaseFold
39    , Data.Text.toLower
40    , Data.Text.toUpper
41    , Data.Text.toTitle
42
43    -- ** Justification
44    , Data.Text.justifyLeft
45    , Data.Text.justifyRight
46    , Data.Text.center
47
48    -- * Folds
49    , Data.Text.foldl
50    , Data.Text.foldl'
51    , Data.Text.foldr
52
53    -- ** Special folds
54    , Data.Text.concat
55    , Data.Text.concatMap
56    , Data.Text.any
57    , Data.Text.all
58
59    -- * Construction
60
61    -- ** Scans
62    , Data.Text.scanl
63    , Data.Text.scanl1 -- scanl1 and scanr1 are /not/ partial
64    , Data.Text.scanr
65    , Data.Text.scanr1
66
67    -- ** Accumulating maps
68    , Data.Text.mapAccumL
69    , Data.Text.mapAccumR
70
71    -- ** Generation and unfolding
72    , Data.Text.replicate
73    , Data.Text.unfoldr
74    , Data.Text.unfoldrN
75
76    -- * Substrings
77
78    -- ** Breaking strings
79    , Data.Text.take
80    , Data.Text.takeEnd
81    , Data.Text.drop
82    , Data.Text.dropEnd
83    , Data.Text.takeWhile
84    , Data.Text.takeWhileEnd
85    , Data.Text.dropWhile
86    , Data.Text.dropWhileEnd
87    , Data.Text.dropAround
88    , Data.Text.strip
89    , Data.Text.stripStart
90    , Data.Text.stripEnd
91    , Data.Text.splitAt
92    , Data.Text.break
93    , Data.Text.span
94    , Data.Text.group
95    , Data.Text.groupBy
96    , Data.Text.inits
97    , Data.Text.tails
98
99    -- ** Breaking into many substrings
100    , Data.Text.split
101    , Data.Text.chunksOf
102
103    -- ** Breaking into lines and words
104    , Data.Text.lines
105    , linesCR
106    , Data.Text.words
107    , Data.Text.unlines
108    , Data.Text.unwords
109
110    -- * Predicates
111    , Data.Text.isPrefixOf
112    , Data.Text.isSuffixOf
113    , Data.Text.isInfixOf
114
115    -- ** View patterns
116    , Data.Text.stripPrefix
117    , Data.Text.stripSuffix
118    , dropPrefix
119    , dropSuffix
120    , Data.Text.commonPrefixes
121
122    -- * Searching
123    , Data.Text.filter
124    , Data.Text.find
125    , Data.Text.partition
126
127    -- * Indexing
128    , Data.Text.index
129    , Data.Text.findIndex
130
131    -- * Zipping
132    , Data.Text.zip
133    , Data.Text.zipWith
134
135    -- * Low level operations
136    , Data.Text.copy
137    , Data.Text.unpackCString#
138
139    -- * Encoding
140    , Data.Text.Encoding.encodeUtf8
141    , Data.Text.Encoding.decodeUtf8With
142    , Data.Text.Encoding.decodeUtf8'
143    , Data.Text.Encoding.Error.lenientDecode
144    ) where
145
146import           Data.Maybe               (fromMaybe)
147import           Data.Text                (Text, stripPrefix, stripSuffix)
148import qualified Data.Text
149import qualified Data.Text.Encoding
150import qualified Data.Text.Encoding.Error
151
152-- | Drop prefix if present, otherwise return original 'Text'.
153--
154-- @since 0.0.0.0
155dropPrefix :: Text -- ^ prefix
156           -> Text
157           -> Text
158dropPrefix prefix t = fromMaybe t (stripPrefix prefix t)
159
160-- | Drop prefix if present, otherwise return original 'Text'.
161--
162-- @since 0.0.0.0
163dropSuffix :: Text -- ^ suffix
164           -> Text
165           -> Text
166dropSuffix suffix t = fromMaybe t (stripSuffix suffix t)
167
168-- | 'linesCR' breaks a 'Text' up into a list of `Text`s at newline
169-- 'Char's. It is very similar to 'Data.Text.lines', but it also removes
170-- any trailing @'\r'@ characters. The resulting 'Text' values do not
171-- contain newlines or trailing @'\r'@ characters.
172--
173-- @since 0.1.0.0
174linesCR :: Text -> [Text]
175linesCR = map (dropSuffix "\r") . Data.Text.lines
176