From 91c8aa3caa5d58f42ea32a17df3e520b9517c120 Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Tue, 17 Nov 2020 07:15:24 -0800 Subject: [PATCH 1/7] Replace unsafeCoerce with safer alternative where possible --- src/Data/String/NonEmpty/CodePoints.purs | 8 ++++---- src/Data/String/NonEmpty/CodeUnits.purs | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Data/String/NonEmpty/CodePoints.purs b/src/Data/String/NonEmpty/CodePoints.purs index 5357851..aa51f14 100644 --- a/src/Data/String/NonEmpty/CodePoints.purs +++ b/src/Data/String/NonEmpty/CodePoints.purs @@ -33,19 +33,19 @@ import Data.Semigroup.Foldable (class Foldable1) import Data.Semigroup.Foldable as F1 import Data.String.CodePoints (CodePoint) import Data.String.CodePoints as CP -import Data.String.NonEmpty.Internal (NonEmptyString, fromString) +import Data.String.NonEmpty.Internal (NonEmptyString(..), fromString) import Data.String.Pattern (Pattern) import Partial.Unsafe (unsafePartial) import Unsafe.Coerce (unsafeCoerce) toNonEmptyString :: String -> NonEmptyString -toNonEmptyString = unsafeCoerce +toNonEmptyString = NonEmptyString fromNonEmptyString :: NonEmptyString -> String -fromNonEmptyString = unsafeCoerce +fromNonEmptyString (NonEmptyString s) = s liftS :: forall r. (String -> r) -> NonEmptyString -> r -liftS = unsafeCoerce +liftS f (NonEmptyString s) = f s fromCodePointArray :: Array CodePoint -> Maybe NonEmptyString fromCodePointArray = case _ of diff --git a/src/Data/String/NonEmpty/CodeUnits.purs b/src/Data/String/NonEmpty/CodeUnits.purs index 2aa0a6c..0b54737 100644 --- a/src/Data/String/NonEmpty/CodeUnits.purs +++ b/src/Data/String/NonEmpty/CodeUnits.purs @@ -33,20 +33,20 @@ import Data.Maybe (Maybe(..), fromJust) import Data.Semigroup.Foldable (class Foldable1) import Data.Semigroup.Foldable as F1 import Data.String.CodeUnits as CU -import Data.String.NonEmpty.Internal (NonEmptyString, fromString) +import Data.String.NonEmpty.Internal (NonEmptyString(..), fromString) import Data.String.Pattern (Pattern) import Data.String.Unsafe as U import Partial.Unsafe (unsafePartial) import Unsafe.Coerce (unsafeCoerce) toNonEmptyString :: String -> NonEmptyString -toNonEmptyString = unsafeCoerce +toNonEmptyString = NonEmptyString fromNonEmptyString :: NonEmptyString -> String -fromNonEmptyString = unsafeCoerce +fromNonEmptyString (NonEmptyString s) = s liftS :: forall r. (String -> r) -> NonEmptyString -> r -liftS = unsafeCoerce +liftS f (NonEmptyString s) = f s -- | Creates a `NonEmptyString` from a character array `String`, returning -- | `Nothing` if the input is empty. From a0423b37ba96e134b36058e87b3b7bcfffbf1642 Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Tue, 17 Nov 2020 13:01:04 -0800 Subject: [PATCH 2/7] Remove unused import --- src/Data/String/NonEmpty/CodePoints.purs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Data/String/NonEmpty/CodePoints.purs b/src/Data/String/NonEmpty/CodePoints.purs index aa51f14..c47dc80 100644 --- a/src/Data/String/NonEmpty/CodePoints.purs +++ b/src/Data/String/NonEmpty/CodePoints.purs @@ -36,7 +36,6 @@ import Data.String.CodePoints as CP import Data.String.NonEmpty.Internal (NonEmptyString(..), fromString) import Data.String.Pattern (Pattern) import Partial.Unsafe (unsafePartial) -import Unsafe.Coerce (unsafeCoerce) toNonEmptyString :: String -> NonEmptyString toNonEmptyString = NonEmptyString From 3fdf0608b8d3e67988c7cb254a4989c3e6dbe0c8 Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Wed, 18 Nov 2020 07:13:46 -0800 Subject: [PATCH 3/7] Add docs to the Internal module and NonEmptyString constructor --- src/Data/String/NonEmpty/Internal.purs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Data/String/NonEmpty/Internal.purs b/src/Data/String/NonEmpty/Internal.purs index bfd2984..47d4c31 100644 --- a/src/Data/String/NonEmpty/Internal.purs +++ b/src/Data/String/NonEmpty/Internal.purs @@ -1,3 +1,9 @@ +-- | While most of the code in this module is safe, this module does +-- | export a few partial functions and the `NonEmptyString` constructor. +-- | While the partial functions are obvious from the `Partial` constraint in +-- | their type signature, the `NonEmptyString` constructor can be overlooked +-- | when searching for issues in one's code. See the constructor's +-- | documentation for more information. module Data.String.NonEmpty.Internal where import Prelude @@ -13,7 +19,15 @@ import Prim.TypeError as TE import Unsafe.Coerce (unsafeCoerce) -- | A string that is known not to be empty. -newtype NonEmptyString = NonEmptyString String +newtype NonEmptyString = + -- | You can use this constructor to create a NonEmptyString that isn't + -- | non-empty, breaking the guarantee behind this newtype. It is + -- | provided as an escape hatch mainly for the `Data.NonEmpty.CodeUnits` + -- | and `Data.NonEmpty.CodePoints` modules. Usage of this constructor + -- | in your own code provides the same safety guarantees of + -- | `unsafeCoerce`, that is, none at all. Use this at your own risk + -- | when you know what you are doing. + NonEmptyString String derive newtype instance eqNonEmptyString ∷ Eq NonEmptyString derive newtype instance ordNonEmptyString ∷ Ord NonEmptyString From 0157801c98f0c25b4e42f517eab6bd7a1d4e3a1e Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Thu, 26 Nov 2020 10:10:34 -0800 Subject: [PATCH 4/7] Remove 'usage of this constructor...' sentence --- src/Data/String/NonEmpty/Internal.purs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Data/String/NonEmpty/Internal.purs b/src/Data/String/NonEmpty/Internal.purs index 47d4c31..aecb530 100644 --- a/src/Data/String/NonEmpty/Internal.purs +++ b/src/Data/String/NonEmpty/Internal.purs @@ -23,9 +23,7 @@ newtype NonEmptyString = -- | You can use this constructor to create a NonEmptyString that isn't -- | non-empty, breaking the guarantee behind this newtype. It is -- | provided as an escape hatch mainly for the `Data.NonEmpty.CodeUnits` - -- | and `Data.NonEmpty.CodePoints` modules. Usage of this constructor - -- | in your own code provides the same safety guarantees of - -- | `unsafeCoerce`, that is, none at all. Use this at your own risk + -- | and `Data.NonEmpty.CodePoints` modules. Use this at your own risk -- | when you know what you are doing. NonEmptyString String From c0be958630dde37677eb896d1d7a22cc701bf0ef Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Thu, 26 Nov 2020 10:11:19 -0800 Subject: [PATCH 5/7] Move constructor docs to type docs Constructor docs don't yet appear in the generated documentation --- src/Data/String/NonEmpty/Internal.purs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Data/String/NonEmpty/Internal.purs b/src/Data/String/NonEmpty/Internal.purs index aecb530..2add3d1 100644 --- a/src/Data/String/NonEmpty/Internal.purs +++ b/src/Data/String/NonEmpty/Internal.purs @@ -19,13 +19,13 @@ import Prim.TypeError as TE import Unsafe.Coerce (unsafeCoerce) -- | A string that is known not to be empty. -newtype NonEmptyString = - -- | You can use this constructor to create a NonEmptyString that isn't - -- | non-empty, breaking the guarantee behind this newtype. It is - -- | provided as an escape hatch mainly for the `Data.NonEmpty.CodeUnits` - -- | and `Data.NonEmpty.CodePoints` modules. Use this at your own risk - -- | when you know what you are doing. - NonEmptyString String +-- | +-- | You can use this constructor to create a NonEmptyString that isn't +-- | non-empty, breaking the guarantee behind this newtype. It is +-- | provided as an escape hatch mainly for the `Data.NonEmpty.CodeUnits` +-- | and `Data.NonEmpty.CodePoints` modules. Use this at your own risk +-- | when you know what you are doing. +newtype NonEmptyString = NonEmptyString String derive newtype instance eqNonEmptyString ∷ Eq NonEmptyString derive newtype instance ordNonEmptyString ∷ Ord NonEmptyString From 9dcca409d8fe3e6c44cc3863b0a22a26f831beba Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Thu, 26 Nov 2020 10:11:49 -0800 Subject: [PATCH 6/7] Add backticks around NonEmptyString in docs --- src/Data/String/NonEmpty/Internal.purs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Data/String/NonEmpty/Internal.purs b/src/Data/String/NonEmpty/Internal.purs index 2add3d1..f5e0a42 100644 --- a/src/Data/String/NonEmpty/Internal.purs +++ b/src/Data/String/NonEmpty/Internal.purs @@ -20,7 +20,7 @@ import Unsafe.Coerce (unsafeCoerce) -- | A string that is known not to be empty. -- | --- | You can use this constructor to create a NonEmptyString that isn't +-- | You can use this constructor to create a `NonEmptyString` that isn't -- | non-empty, breaking the guarantee behind this newtype. It is -- | provided as an escape hatch mainly for the `Data.NonEmpty.CodeUnits` -- | and `Data.NonEmpty.CodePoints` modules. Use this at your own risk From 036e260b3d255fb740936bfc9e10ab472e365c5e Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Thu, 26 Nov 2020 11:07:55 -0800 Subject: [PATCH 7/7] Add "For internal use only. Do not export" above to/fromNEString & listS --- src/Data/String/NonEmpty/CodePoints.purs | 3 +++ src/Data/String/NonEmpty/CodeUnits.purs | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/Data/String/NonEmpty/CodePoints.purs b/src/Data/String/NonEmpty/CodePoints.purs index c47dc80..7b5328a 100644 --- a/src/Data/String/NonEmpty/CodePoints.purs +++ b/src/Data/String/NonEmpty/CodePoints.purs @@ -37,12 +37,15 @@ import Data.String.NonEmpty.Internal (NonEmptyString(..), fromString) import Data.String.Pattern (Pattern) import Partial.Unsafe (unsafePartial) +-- For internal use only. Do not export. toNonEmptyString :: String -> NonEmptyString toNonEmptyString = NonEmptyString +-- For internal use only. Do not export. fromNonEmptyString :: NonEmptyString -> String fromNonEmptyString (NonEmptyString s) = s +-- For internal use only. Do not export. liftS :: forall r. (String -> r) -> NonEmptyString -> r liftS f (NonEmptyString s) = f s diff --git a/src/Data/String/NonEmpty/CodeUnits.purs b/src/Data/String/NonEmpty/CodeUnits.purs index 0b54737..d22e180 100644 --- a/src/Data/String/NonEmpty/CodeUnits.purs +++ b/src/Data/String/NonEmpty/CodeUnits.purs @@ -39,12 +39,15 @@ import Data.String.Unsafe as U import Partial.Unsafe (unsafePartial) import Unsafe.Coerce (unsafeCoerce) +-- For internal use only. Do not export. toNonEmptyString :: String -> NonEmptyString toNonEmptyString = NonEmptyString +-- For internal use only. Do not export. fromNonEmptyString :: NonEmptyString -> String fromNonEmptyString (NonEmptyString s) = s +-- For internal use only. Do not export. liftS :: forall r. (String -> r) -> NonEmptyString -> r liftS f (NonEmptyString s) = f s