@@ -1,6 +1,6 @@
2-- Module : Text.Inflections
2-- Module : Text.Inflections
3−-- Description : Rails-like inflections library for common Text transformations.
3+-- Description : Rails-like inflections library for common String transformations.
4-- Copyright : (c) Justin Leitgeb
4-- Copyright : (c) Justin Leitgeb
5-- License : MIT
5-- License : MIT
@@ -8,7 +8,7 @@
8-- Stability : unstable
8-- Stability : unstable
9-- Portability : portable
9-- Portability : portable
11−-- This module provides methods for common 'Text' transformations, similar
11+-- This module provides methods for common String transformations, similar
12-- to the Inflections library found in Rails:
12-- to the Inflections library found in Rails:
14-- <http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html>
14-- <http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html>
@@ -17,7 +17,7 @@
17-- implementations in Rails' ActiveSupport, the philosophy of this library
17-- implementations in Rails' ActiveSupport, the philosophy of this library
18-- is fundamentally different. Where Rails tries to be as permissive as
18-- is fundamentally different. Where Rails tries to be as permissive as
19-- possible, and return a String when given any input, this library tries to
19-- possible, and return a String when given any input, this library tries to
20−-- output 'Text' that makes sense according to the function that is called.
20+-- output strings that make sense according to the function that is called.
22-- When you look closely at many of the functions in Rails' inflections
22-- When you look closely at many of the functions in Rails' inflections
23-- library, you will notice that many of them are partial. That is, they
23-- library, you will notice that many of them are partial. That is, they
@@ -33,7 +33,7 @@
33-- >>> "foo bar".underscore
33-- >>> "foo bar".underscore
34-- "foo bar"
34-- "foo bar"
36−-- The output isn't underscored — it contains a space! It turns out that
36+-- The output isn't underscored - it contains a space! It turns out that
37-- some of the functions from Inflections in ActiveSupport are /partial/.
37-- some of the functions from Inflections in ActiveSupport are /partial/.
38-- I.e., the outputs are really only specified for a certain range of the
38-- I.e., the outputs are really only specified for a certain range of the
39-- inputs allowed by the String type.
39-- inputs allowed by the String type.
@@ -42,7 +42,7 @@
42-- results by separating the parsing of strings into tokens from the
42-- results by separating the parsing of strings into tokens from the
43-- application of transformations. Let's see an example.
43-- application of transformations. Let's see an example.
45−-- First, we tokenize an underscored 'Text' using 'parseSnakeCase':
45+-- First, we tokenize an underscored String using 'parseSnakeCase':
47-- >>> parseSnakeCase [] "foo_bar"
47-- >>> parseSnakeCase [] "foo_bar"
48-- Right [Word "foo",Word "bar"]
48-- Right [Word "foo",Word "bar"]
@@ -79,24 +79,14 @@
79{-# LANGUAGE CPP #-}
79{-# LANGUAGE CPP #-}
81module Text.Inflections
81module Text.Inflections
82− ( -- * Types and helpers
90− , InflectionException (..)
91− -- * Parsing
82+ ( -- * Parsing
92− , parseSnakeCase
83+ parseSnakeCase
93 , parseCamelCase
84 , parseCamelCase
94 -- * Rendering
85 -- * Rendering
95 , camelize
86 , camelize
96 , camelizeCustom
87 , camelizeCustom
97 , dasherize
88 , dasherize
98 , humanize
89 , humanize
100 , underscore
90 , underscore
101 , titleize
91 , titleize
102 , Transliterations
92 , Transliterations
@@ -107,21 +97,28 @@ module Text.Inflections
107 , transliterateCustom
97 , transliterateCustom
108 , ordinalize
98 , ordinalize
109 , ordinal
99 , ordinal
100+ -- * Types and helpers
108+ , InflectionException (..)
110 -- * Often used combinators
109 -- * Often used combinators
111 , toUnderscore
110 , toUnderscore
112 , toDashed
111 , toDashed
113 , toCamelCased
112 , toCamelCased
115 , betterThrow )
113 , betterThrow )
118import Control.Monad.Catch (MonadThrow (..))
116import Control.Monad.Catch (MonadThrow (..))
119import Data.Text (Text)
117import Data.Text (Text)
120−import Data.Void (Void)
121import Text.Inflections.Camelize (camelize, camelizeCustom)
118import Text.Inflections.Camelize (camelize, camelizeCustom)
122import Text.Inflections.Dasherize (dasherize)
119import Text.Inflections.Dasherize (dasherize)
123import Text.Inflections.Data (Transliterations, defaultTransliterations)
120import Text.Inflections.Data (Transliterations, defaultTransliterations)
124−import Text.Inflections.Humanize (humanize, humanizeCustom)
121+import Text.Inflections.Humanize (humanize)
125import Text.Inflections.Ordinal (ordinal, ordinalize)
122import Text.Inflections.Ordinal (ordinal, ordinalize)
126import Text.Inflections.Parameterize (parameterize, parameterizeCustom)
123import Text.Inflections.Parameterize (parameterize, parameterizeCustom)
127import Text.Inflections.Parse.CamelCase (parseCamelCase)
124import Text.Inflections.Parse.CamelCase (parseCamelCase)
@@ -142,7 +139,7 @@ import Prelude hiding (Word)
143-- >>> toUnderscore "FooBarBazz"
140-- >>> toUnderscore "FooBarBazz"
144-- "foo_bar_bazz"
141-- "foo_bar_bazz"
145−toUnderscore :: Text -> Either (ParseErrorBundle Text Void) Text
142+toUnderscore :: Text -> Either (ParseError Char Dec) Text
146toUnderscore = fmap underscore . parseCamelCase []
143toUnderscore = fmap underscore . parseCamelCase []
148-- | Transforms CamelCasedString to snake-cased-string-with-dashes.
145-- | Transforms CamelCasedString to snake-cased-string-with-dashes.
@@ -151,45 +148,26 @@ toUnderscore = fmap underscore . parseCamelCase []
152-- >>> toDashed "FooBarBazz"
149-- >>> toDashed "FooBarBazz"
153-- "foo-bar-bazz"
150-- "foo-bar-bazz"
154−toDashed :: Text -> Either (ParseErrorBundle Text Void) Text
151+toDashed :: Text -> Either (ParseError Char Dec) Text
155toDashed = fmap dasherize . parseCamelCase []
152toDashed = fmap dasherize . parseCamelCase []
157-- | Transforms underscored_text to CamelCasedText. If first argument is
154-- | Transforms underscored_text to CamelCasedText. If first argument is
158−-- 'True' then the first character in the result string will be in upper case. If
155+-- 'True' then FirstCharacter in result string will be in upper case. If
159−-- 'False' then the first character will be in lower case.
156+-- 'False' then firstCharacter will be in lower case.
161−-- > toCamelCased c = fmap (camelizeCustom c) . parseSnakeCase []
158+-- > toCamelCased t = fmap (camelizeCustom t) . parseSnakeCase []
163-- >>> toCamelCased True "foo_bar_bazz"
160-- >>> toCamelCased True "foo_bar_bazz"
164-- "FooBarBazz"
161-- "FooBarBazz"
165-- >>> toCamelCased False "foo_bar_bazz"
162-- >>> toCamelCased False "foo_bar_bazz"
166-- "fooBarBazz"
163-- "fooBarBazz"
167toCamelCased
164toCamelCased
168− :: Bool -- ^ Capitalize the first character
165+ :: Bool -- ^ Capitalize the first character
169− -> Text -- ^ Input
166+ -> Text -- ^ Input
170− -> Either (ParseErrorBundle Text Void) Text -- ^ Output
167+ -> Either (ParseError Char Dec) Text -- ^ Ouput
171−toCamelCased c = fmap (camelizeCustom c) . parseSnakeCase []
168+toCamelCased t = fmap (camelizeCustom t) . parseSnakeCase []
173−-- | Transforms underscored_text to space-separated human-readable text.
174−-- If first argument is 'True' then the first character in the result
175−-- string will be in upper case. If 'False' then the first character will be
178−-- > toHumanized c = fmap (humanizeCustom c) . parseSnakeCase []
180−-- >>> toHumanized True "foo_bar_bazz"
182−-- >>> toHumanized False "foo_bar_bazz"
187− :: Bool -- ^ Capitalize the first character
189− -> Either (ParseErrorBundle Text Void) Text -- ^ Output
190−toHumanized c = fmap (humanizeCustom c) . parseSnakeCase []
192−-- | Lift something of type @'Either' ('ParseError' 'Char' 'Void') a@ to
170+-- | Lift something of type @'Either' ('ParseError' 'Char' 'Dec') a@ to
193-- an instance of 'MonadThrow'. Useful when you want to shortcut on parsing
171-- an instance of 'MonadThrow'. Useful when you want to shortcut on parsing
194-- failures and you're in an instance of 'MonadThrow'.
172-- failures and you're in an instance of 'MonadThrow'.
@@ -197,6 +175,6 @@ toHumanized c = fmap (humanizeCustom c) . parseSnakeCase []
198-- /since 0.3.0.0/
176-- /since 0.3.0.0/
200−betterThrow :: MonadThrow m => Either (ParseErrorBundle Text Void) a -> m a
178+betterThrow :: MonadThrow m => Either (ParseError Char Dec) a -> m a
201betterThrow (Left err) = throwM (InflectionParsingFailed err)
179betterThrow (Left err) = throwM (InflectionParsingFailed err)
202betterThrow (Right x) = return x
180betterThrow (Right x) = return x