From d63872b7194e32a399531525360d74d505d8a30f Mon Sep 17 00:00:00 2001 From: Leonid Vasilev Date: Thu, 14 Apr 2022 18:05:42 +0300 Subject: [PATCH] [#165] `readMaybe` type changing Problem: `readMaybe` type isn't polymorphic. One of key points in the design of `Universum` is to avoid `String` as much as possible. Solution: changed type to `readMaybe :: (ToString a, Read b) => a -> Maybe b` --- CHANGES.md | 4 ++++ src/Universum/String/Conversion.hs | 13 ++++++++++++- src/Universum/String/Reexport.hs | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 9fcd3725..7d45d385 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -15,6 +15,10 @@ Unreleased * [#182](https://github.com/serokell/universum/issues/182): Deprecate `microlens` and `microlens-mtl` dependencies. +* [#165](https://github.com/serokell/universum/issues/165): + Change the type of `readMaybe` from `readMaybe :: Read a => String -> Maybe a` + to it's polymorphic version `readMaybe :: forall b a. (ToString a, Read b) => a -> Maybe b`. + 1.7.3 ===== diff --git a/src/Universum/String/Conversion.hs b/src/Universum/String/Conversion.hs index 9c38de00..2c3b9bcd 100644 --- a/src/Universum/String/Conversion.hs +++ b/src/Universum/String/Conversion.hs @@ -25,12 +25,14 @@ module Universum.String.Conversion -- * Show and read functions , readEither + , readMaybe , show ) where import Data.Bifunctor (first) import Data.Either (Either) import Data.Function (id, (.)) +import Data.Maybe (Maybe) import Data.String (String) import qualified Data.Text.Internal as T import qualified Data.Text.Internal.Fusion.Common as TF @@ -47,7 +49,7 @@ 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) +import qualified Text.Read (readEither, readMaybe) import qualified GHC.Show as Show (Show (show)) @@ -293,6 +295,15 @@ be safe to collapse. readEither :: (ToString a, Read b) => a -> Either Text b readEither = first toText . Text.Read.readEither . toString +-- | Polymorhpic version of 'Text.Read.readMaybe'. +-- +-- >>> readMaybe @Int @Text "123" +-- Just 123 +-- >>> readMaybe @Int @Text "aa" +-- Nothing +readMaybe :: forall b a. (ToString a, Read b) => a -> Maybe b +readMaybe = Text.Read.readMaybe . toString + -- | Generalized version of 'Prelude.show'. show :: forall b a . (Show.Show a, IsString b) => a -> b show x = fromString (Show.show x) diff --git a/src/Universum/String/Reexport.hs b/src/Universum/String/Reexport.hs index 10c90d2c..25eb7a7d 100644 --- a/src/Universum/String/Reexport.hs +++ b/src/Universum/String/Reexport.hs @@ -24,4 +24,4 @@ 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) +import Text.Read (Read, reads)