universum 0.7.1.1 → 0.8.0
raw patch · 7 files changed
+233/−207 lines, 7 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Conv: class ConvertUtf8 a b
- Conv: class ToLText a
- Conv: class ToString a
- Conv: class ToText a
- Conv: decodeUtf8 :: ConvertUtf8 a b => b -> a
- Conv: decodeUtf8Strict :: ConvertUtf8 a b => b -> Either UnicodeException a
- Conv: encodeUtf8 :: ConvertUtf8 a b => a -> b
- Conv: instance Conv.ConvertUtf8 Data.Text.Internal.Lazy.Text Data.ByteString.Internal.ByteString
- Conv: instance Conv.ConvertUtf8 Data.Text.Internal.Lazy.Text Data.ByteString.Lazy.Internal.ByteString
- Conv: instance Conv.ConvertUtf8 Data.Text.Internal.Text Data.ByteString.Internal.ByteString
- Conv: instance Conv.ConvertUtf8 Data.Text.Internal.Text Data.ByteString.Lazy.Internal.ByteString
- Conv: instance Conv.ConvertUtf8 GHC.Base.String Data.ByteString.Internal.ByteString
- Conv: instance Conv.ConvertUtf8 GHC.Base.String Data.ByteString.Lazy.Internal.ByteString
- Conv: instance Conv.ToLText Data.Text.Internal.Lazy.Text
- Conv: instance Conv.ToLText Data.Text.Internal.Text
- Conv: instance Conv.ToLText GHC.Base.String
- Conv: instance Conv.ToString Data.Text.Internal.Lazy.Text
- Conv: instance Conv.ToString Data.Text.Internal.Text
- Conv: instance Conv.ToString GHC.Base.String
- Conv: instance Conv.ToText Data.Text.Internal.Lazy.Text
- Conv: instance Conv.ToText Data.Text.Internal.Text
- Conv: instance Conv.ToText GHC.Base.String
- Conv: toLText :: ToLText a => a -> Text
- Conv: toString :: ToString a => a -> String
- Conv: toText :: ToText a => a -> Text
- Universum: class Buildable p
- Universum: pretty :: Buildable a => a -> Text
- Universum: prettyL :: Buildable a => a -> LText
- Universum: print :: (MonadIO m, Show a) => a -> m ()
- Universum: readEither :: (ToString a, Read b) => a -> Either Text b
- Universum: show :: (Show a, IsString b) => a -> b
- Universum: type LByteString = ByteString
- Universum: type LText = Text
+ Print: print :: forall a m. (MonadIO m, Show a) => a -> m ()
+ String: class Buildable p
+ String: class ConvertUtf8 a b
+ String: class ToLText a
+ String: class ToString a
+ String: class ToText a
+ String: decodeUtf8 :: ConvertUtf8 a b => b -> a
+ String: decodeUtf8Strict :: ConvertUtf8 a b => b -> Either UnicodeException a
+ String: encodeUtf8 :: ConvertUtf8 a b => a -> b
+ String: instance String.ConvertUtf8 Data.Text.Internal.Lazy.Text Data.ByteString.Internal.ByteString
+ String: instance String.ConvertUtf8 Data.Text.Internal.Lazy.Text Data.ByteString.Lazy.Internal.ByteString
+ String: instance String.ConvertUtf8 Data.Text.Internal.Text Data.ByteString.Internal.ByteString
+ String: instance String.ConvertUtf8 Data.Text.Internal.Text Data.ByteString.Lazy.Internal.ByteString
+ String: instance String.ConvertUtf8 GHC.Base.String Data.ByteString.Internal.ByteString
+ String: instance String.ConvertUtf8 GHC.Base.String Data.ByteString.Lazy.Internal.ByteString
+ String: instance String.ToLText Data.Text.Internal.Lazy.Text
+ String: instance String.ToLText Data.Text.Internal.Text
+ String: instance String.ToLText GHC.Base.String
+ String: instance String.ToString Data.Text.Internal.Lazy.Text
+ String: instance String.ToString Data.Text.Internal.Text
+ String: instance String.ToString GHC.Base.String
+ String: instance String.ToText Data.Text.Internal.Lazy.Text
+ String: instance String.ToText Data.Text.Internal.Text
+ String: instance String.ToText GHC.Base.String
+ String: pretty :: Buildable a => a -> Text
+ String: prettyL :: Buildable a => a -> LText
+ String: readEither :: (ToString a, Read b) => a -> Either Text b
+ String: show :: forall b a. (Show a, IsString b) => a -> b
+ String: toLText :: ToLText a => a -> Text
+ String: toString :: ToString a => a -> String
+ String: toText :: ToText a => a -> Text
+ String: type LByteString = ByteString
+ String: type LText = Text
Files
- CHANGES.md +15/−0
- src/Conv.hs +0/−121
- src/Monad/Trans.hs +2/−2
- src/Print.hs +16/−9
- src/String.hs +196/−0
- src/Universum.hs +2/−73
- universum.cabal +2/−2
CHANGES.md view
@@ -1,3 +1,18 @@+0.8.0+=====++* [#83](https://github.com/serokell/universum/issues/83):+ Change the order of types in `show` and `print` functions.+* Move string related reexports and functions to `Conv` module.+* Rename `Conv` module to `String`.+* Move `print` function to `Print` module.++0.7.2+=======++* [#77](https://github.com/serokell/universum/issues/77):+ Add `modify'` function to export list.+ 0.7.1.1 =======
− src/Conv.hs
@@ -1,121 +0,0 @@-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE Safe #-}-{-# LANGUAGE TypeSynonymInstances #-}---- | Type classes for convertion between different string representations.--module Conv- ( ConvertUtf8 (..)- , ToString (..)- , ToLText (..)- , ToText (..)- ) where--import qualified Data.ByteString as B-import qualified Data.ByteString.Lazy as LB-import qualified Data.ByteString.Lazy.UTF8 as LBU-import qualified Data.ByteString.UTF8 as BU-import qualified Data.Text as T-import qualified Data.Text.Encoding as T-import qualified Data.Text.Encoding.Error as T-import qualified Data.Text.Lazy as LT-import qualified Data.Text.Lazy.Encoding as LT--import Data.Either (Either)-import Data.Function (id, (.))-import Data.String (String)-import Functor ((<$>))---- | Type class for conversion to utf8 representation of text.-class ConvertUtf8 a b where- -- | Encode as utf8 string (usually 'B.ByteString').- --- -- >>> encodeUtf8 @Text @ByteString "патак"- -- "\208\191\208\176\209\130\208\176\208\186"- encodeUtf8 :: a -> b-- -- | Decode from utf8 string.- --- -- >>> decodeUtf8 @Text @ByteString "\208\191\208\176\209\130\208\176\208\186"- -- "\1087\1072\1090\1072\1082"- -- >>> putStrLn $ decodeUtf8 @Text @ByteString "\208\191\208\176\209\130\208\176\208\186"- -- патак- decodeUtf8 :: b -> a-- -- | Decode as utf8 string but returning execption if byte sequence is malformed.- --- -- >>> decodeUtf8 @Text @ByteString "\208\208\176\209\130\208\176\208\186"- -- "\65533\65533\1090\1072\1082"- -- >>> decodeUtf8Strict @Text @ByteString "\208\208\176\209\130\208\176\208\186"- -- Left Cannot decode byte '\xd0': Data.Text.Internal.Encoding.decodeUtf8: Invalid UTF-8 stream- decodeUtf8Strict :: b -> Either T.UnicodeException a--instance ConvertUtf8 String B.ByteString where- encodeUtf8 = BU.fromString- decodeUtf8 = BU.toString- decodeUtf8Strict = (T.unpack <$>) . decodeUtf8Strict--instance ConvertUtf8 T.Text B.ByteString where- encodeUtf8 = T.encodeUtf8- decodeUtf8 = T.decodeUtf8With T.lenientDecode- decodeUtf8Strict = T.decodeUtf8'--instance ConvertUtf8 LT.Text B.ByteString where- encodeUtf8 = LB.toStrict . encodeUtf8- decodeUtf8 = LT.decodeUtf8With T.lenientDecode . LB.fromStrict- decodeUtf8Strict = decodeUtf8Strict . LB.fromStrict--instance ConvertUtf8 String LB.ByteString where- encodeUtf8 = LBU.fromString- decodeUtf8 = LBU.toString- decodeUtf8Strict = (T.unpack <$>) . decodeUtf8Strict--instance ConvertUtf8 T.Text LB.ByteString where- encodeUtf8 = LB.fromStrict . T.encodeUtf8- decodeUtf8 = T.decodeUtf8With T.lenientDecode . LB.toStrict- decodeUtf8Strict = T.decodeUtf8' . LB.toStrict--instance ConvertUtf8 LT.Text LB.ByteString where- encodeUtf8 = LT.encodeUtf8- decodeUtf8 = LT.decodeUtf8With T.lenientDecode- decodeUtf8Strict = LT.decodeUtf8'---- | Type class for converting other strings to 'T.Text'.-class ToText a where- toText :: a -> T.Text--instance ToText String where- toText = T.pack--instance ToText T.Text where- toText = id--instance ToText LT.Text where- toText = LT.toStrict---- | Type class for converting other strings to 'LT.Text'.-class ToLText a where- toLText :: a -> LT.Text--instance ToLText String where- toLText = LT.pack--instance ToLText T.Text where- toLText = LT.fromStrict--instance ToLText LT.Text where- toLText = id---- | Type class for converting other strings to 'String'.-class ToString a where- toString :: a -> String--instance ToString String where- toString = id--instance ToString T.Text where- toString = T.unpack--instance ToString LT.Text where- toString = LT.unpack
src/Monad/Trans.hs view
@@ -30,8 +30,8 @@ asks, local, reader, runReader) import Control.Monad.State.Strict (MonadState, State, StateT (..), evalState, evalStateT, execState, execStateT, get,- gets, modify, put, runState, state,- withState)+ gets, modify, modify', put, runState,+ state, withState) import Control.Monad.Trans (MonadIO, MonadTrans, lift, liftIO) import Control.Monad.Trans.Identity (IdentityT (runIdentityT)) import Control.Monad.Trans.Maybe (MaybeT (..), exceptToMaybeT,
src/Print.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE ExplicitForAll #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE Trustworthy #-}@@ -6,24 +7,26 @@ module Print ( Print (..)+ , print , putText , putLText ) where +import Data.Function ((.))++import Monad.Trans (MonadIO, liftIO)+ import qualified Base-import Data.Function ((.))-import qualified Prelude as Prelude+import qualified Prelude (print, putStr, putStrLn) -import Control.Monad.IO.Class (MonadIO, liftIO)-import qualified Data.ByteString.Char8 as BS+import qualified Data.ByteString.Char8 as BS import qualified Data.ByteString.Lazy.Char8 as BL -import qualified Data.Text as T-import qualified Data.Text.IO as T--import qualified Data.Text.Lazy as TL-import qualified Data.Text.Lazy.IO as TL+import qualified Data.Text as T+import qualified Data.Text.IO as T +import qualified Data.Text.Lazy as TL+import qualified Data.Text.Lazy.IO as TL -- | Polymorfic over string and lifted to 'MonadIO' printing functions. class Print a where@@ -49,6 +52,10 @@ instance Print [Base.Char] where putStr = liftIO . Prelude.putStr putStrLn = liftIO . Prelude.putStrLn++-- | Lifted version of 'Prelude.print'.+print :: forall a m . (MonadIO m, Base.Show a) => a -> m ()+print = liftIO . Prelude.print -- | Specialized to 'T.Text' version of 'putStrLn' or forcing type inference. putText :: MonadIO m => T.Text -> m ()
+ src/String.hs view
@@ -0,0 +1,196 @@+{-# LANGUAGE ExplicitForAll #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TypeSynonymInstances #-}++-- | Type classes for convertion between different string representations.++module String+ ( module Data.String++ -- * Text+ , module Text.Read+ , module Data.Text+ , module Data.Text.Lazy+ , module Data.Text.Encoding+ , module Data.Text.Encoding.Error++ , module Data.ByteString++ , ConvertUtf8 (..)+ , ToString (..)+ , ToLText (..)+ , ToText (..)++ -- * Buildable class+ , Buildable++ -- * Show and read functions+ , readEither+ , show+ , pretty+ , prettyL++ -- * Convenient type aliases+ , LText+ , LByteString+ ) where+++-- for reexport+import Data.ByteString (ByteString)+import Data.String (IsString (..))+import Data.Text (Text, lines, unlines, unwords, words)+import Data.Text.Buildable (Buildable (build))+import Data.Text.Encoding (decodeUtf8', decodeUtf8With)+import Data.Text.Encoding.Error (OnDecodeError, OnError, UnicodeException, lenientDecode,+ strictDecode)+import Data.Text.Lazy (fromStrict, toStrict)+import Text.Read (Read, readMaybe, reads)++-- for internal usage+import Data.Bifunctor (first)+import Data.Either (Either)+import Data.Function (id, (.))+import Data.String (String)+import Data.Text.Lazy.Builder (toLazyText)++import Functor ((<$>))++import qualified Base as Base (Show (show))+import qualified Data.ByteString as B+import qualified Data.ByteString.Lazy as LB+import qualified Data.ByteString.Lazy.UTF8 as LBU+import qualified Data.ByteString.UTF8 as BU+import qualified Data.Text as T+import qualified Data.Text.Encoding as T+import qualified Data.Text.Encoding.Error as T+import qualified Data.Text.Lazy as LT+import qualified Data.Text.Lazy.Encoding as LT+import qualified Text.Read (readEither)++-- | Type synonym for 'Data.Text.Lazy.Text'.+type LText = LT.Text++-- | Type synonym for 'Data.ByteString.Lazy.ByteString'.+type LByteString = LB.ByteString+++-- | Type class for conversion to utf8 representation of text.+class ConvertUtf8 a b where+ -- | Encode as utf8 string (usually 'B.ByteString').+ --+ -- >>> encodeUtf8 @Text @ByteString "патак"+ -- "\208\191\208\176\209\130\208\176\208\186"+ encodeUtf8 :: a -> b++ -- | Decode from utf8 string.+ --+ -- >>> decodeUtf8 @Text @ByteString "\208\191\208\176\209\130\208\176\208\186"+ -- "\1087\1072\1090\1072\1082"+ -- >>> putStrLn $ decodeUtf8 @Text @ByteString "\208\191\208\176\209\130\208\176\208\186"+ -- патак+ decodeUtf8 :: b -> a++ -- | Decode as utf8 string but returning execption if byte sequence is malformed.+ --+ -- >>> decodeUtf8 @Text @ByteString "\208\208\176\209\130\208\176\208\186"+ -- "\65533\65533\1090\1072\1082"+ -- >>> decodeUtf8Strict @Text @ByteString "\208\208\176\209\130\208\176\208\186"+ -- Left Cannot decode byte '\xd0': Data.Text.Internal.Encoding.decodeUtf8: Invalid UTF-8 stream+ decodeUtf8Strict :: b -> Either T.UnicodeException a++instance ConvertUtf8 String B.ByteString where+ encodeUtf8 = BU.fromString+ decodeUtf8 = BU.toString+ decodeUtf8Strict = (T.unpack <$>) . decodeUtf8Strict++instance ConvertUtf8 T.Text B.ByteString where+ encodeUtf8 = T.encodeUtf8+ decodeUtf8 = T.decodeUtf8With T.lenientDecode+ decodeUtf8Strict = T.decodeUtf8'++instance ConvertUtf8 LT.Text B.ByteString where+ encodeUtf8 = LB.toStrict . encodeUtf8+ decodeUtf8 = LT.decodeUtf8With T.lenientDecode . LB.fromStrict+ decodeUtf8Strict = decodeUtf8Strict . LB.fromStrict++instance ConvertUtf8 String LB.ByteString where+ encodeUtf8 = LBU.fromString+ decodeUtf8 = LBU.toString+ decodeUtf8Strict = (T.unpack <$>) . decodeUtf8Strict++instance ConvertUtf8 T.Text LB.ByteString where+ encodeUtf8 = LB.fromStrict . T.encodeUtf8+ decodeUtf8 = T.decodeUtf8With T.lenientDecode . LB.toStrict+ decodeUtf8Strict = T.decodeUtf8' . LB.toStrict++instance ConvertUtf8 LT.Text LB.ByteString where+ encodeUtf8 = LT.encodeUtf8+ decodeUtf8 = LT.decodeUtf8With T.lenientDecode+ decodeUtf8Strict = LT.decodeUtf8'++-- | Type class for converting other strings to 'T.Text'.+class ToText a where+ toText :: a -> T.Text++instance ToText String where+ toText = T.pack++instance ToText T.Text where+ toText = id++instance ToText LT.Text where+ toText = LT.toStrict++-- | Type class for converting other strings to 'LT.Text'.+class ToLText a where+ toLText :: a -> LT.Text++instance ToLText String where+ toLText = LT.pack++instance ToLText T.Text where+ toLText = LT.fromStrict++instance ToLText LT.Text where+ toLText = id++-- | Type class for converting other strings to 'String'.+class ToString a where+ toString :: a -> String++instance ToString String where+ toString = id++instance ToString T.Text where+ toString = T.unpack++instance ToString LT.Text where+ toString = LT.unpack++-- | Polymorhpic version of 'Text.Read.readEither'.+--+-- >>> readEither @Text @Int "123"+-- Right 123+-- >>> readEither @Text @Int "aa"+-- Left "Prelude.read: no parse"+readEither :: (ToString a, Read b) => a -> Either Text b+readEither = first toText . Text.Read.readEither . toString++-- | Generalized version of 'Prelude.show'.+show :: forall b a . (Base.Show a, IsString b) => a -> b+show x = fromString (Base.show x)+{-# SPECIALIZE show :: Base.Show a => a -> Text #-}+{-# SPECIALIZE show :: Base.Show a => a -> LText #-}+{-# SPECIALIZE show :: Base.Show a => a -> ByteString #-}+{-# SPECIALIZE show :: Base.Show a => a -> LByteString #-}+{-# SPECIALIZE show :: Base.Show a => a -> String #-}++-- | Functions to show pretty output for buildable data types.+pretty :: Buildable a => a -> Text+pretty = toStrict . prettyL++-- | Similar to 'pretty' but for 'LText'.+prettyL :: Buildable a => a -> LText+prettyL = toLazyText . build
src/Universum.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE ExplicitForAll #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE Trustworthy #-}@@ -18,9 +19,6 @@ module X -- Should I expand this to all modules to remove haddock warnings? , module Base - -- * Useful classes- , Buildable- -- * Useful standard unclassifed functions , evaluateNF , evaluateNF_@@ -28,23 +26,13 @@ , evaluateWHNF_ , identity , map- , pretty- , prettyL- , print- , readEither- , show , uncons , unsnoc-- -- * Convenient type aliases- , LText- , LByteString ) where import Applicative as X import Bool as X import Containers as X-import Conv as X import Debug as X import Exceptions as X import Functor as X@@ -52,16 +40,14 @@ import List as X import Monad as X import Print as X+import String as X import TypeOps as X import VarArg as X import Base as Base hiding (error, show, showFloat, showList, showSigned, showSignedFloat, showsPrec, undefined)-import qualified Base as PBase -import Data.String as X (IsString (..))- -- Maybe'ized version of partial functions import Safe as X (atDef, atMay, foldl1May, foldr1May, headDef, headMay, initDef, initMay,@@ -131,25 +117,6 @@ -- Generics import GHC.Generics as X (Generic) --- Buildable-import Data.Text.Buildable (Buildable (build))-import Data.Text.Lazy.Builder (toLazyText)---- ByteString-import Data.ByteString as X (ByteString)-import qualified Data.ByteString.Lazy---- Text-import Data.Text as X (Text, lines, unlines, unwords, words)-import qualified Data.Text.Lazy--import Data.Text.Lazy as X (fromStrict, toStrict)--import Data.Text.Encoding as X (decodeUtf8', decodeUtf8With)-import Data.Text.Encoding.Error as X (OnDecodeError, OnError, UnicodeException,- lenientDecode, strictDecode)-import Text.Read as X (Read, readMaybe, reads)- -- IO import System.IO as X (FilePath, Handle, IOMode (..), stderr, stdin, stdout, withFile)@@ -162,15 +129,7 @@ -- For internal usage only import qualified Control.Exception.Base (evaluate)-import qualified Prelude (print)-import qualified Text.Read (readEither) --- | Type synonym for 'Data.Text.Lazy.Text'.-type LText = Data.Text.Lazy.Text---- | Type synonym for 'Data.ByteString.Lazy.ByteString'.-type LByteString = Data.ByteString.Lazy.ByteString- -- | Renamed version of 'Prelude.id'. identity :: a -> a identity x = x@@ -199,36 +158,6 @@ go x mxs = Just (case mxs of Nothing -> ([], x) Just (xs, e) -> (x:xs, e))---- | Lifted version of 'Prelude.print'.-print :: (X.MonadIO m, PBase.Show a) => a -> m ()-print = liftIO . Prelude.print---- | Polymorhpic version of 'Text.Read.readEither'.------ >>> readEither @Text @Int "123"--- Right 123--- >>> readEither @Text @Int "aa"--- Left "Prelude.read: no parse"-readEither :: (ToString a, Read b) => a -> Either Text b-readEither = X.first toText . Text.Read.readEither . X.toString---- | Generalized version of 'Prelude.show'.-show :: (Show a, IsString b) => a -> b-show x = X.fromString (PBase.show x)-{-# SPECIALIZE show :: Show a => a -> Text #-}-{-# SPECIALIZE show :: Show a => a -> LText #-}-{-# SPECIALIZE show :: Show a => a -> ByteString #-}-{-# SPECIALIZE show :: Show a => a -> LByteString #-}-{-# SPECIALIZE show :: Show a => a -> String #-}---- | Functions to show pretty output for buildable data types.-pretty :: Buildable a => a -> Text-pretty = X.toStrict . prettyL---- | Similar to 'pretty' but for 'LText'.-prettyL :: Buildable a => a -> LText-prettyL = toLazyText . build -- | Lifted alias for 'Control.Exception.Base.evaluate' with clearer name. evaluateWHNF :: MonadIO m => a -> m a
universum.cabal view
@@ -1,5 +1,5 @@ name: universum-version: 0.7.1.1+version: 0.8.0 cabal-version: >=1.10 build-type: Simple license: MIT@@ -29,13 +29,13 @@ Base Bool Containers- Conv Debug Exceptions Functor List Nub Print+ String TypeOps Unsafe VarArg