-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Constrained text newtypes -- -- See README at -- https://github.com/MercuryTechnologies/string-variants#readme. @package string-variants @version 0.3.1.0 module Data.StringVariants.Util type family SymbolNonEmpty (s :: Symbol) :: Constraint type SymbolWithNoSpaceAround s = (SymbolNoLeadingSpace (UnconsSymbol s), SymbolNoTrailingSpace (UnconsSymbol s)) type family SymbolNoLongerThan (s :: Symbol) (n :: Nat) :: Constraint -- | If the integer is >= 1, evaluate the function with the proof of -- that. Otherwise, return the default value usePositiveNat :: Integer -> a -> (forall n proxy. (KnownNat n, 1 <= n) => proxy n -> a) -> a textIsWhitespace :: Text -> Bool textHasNoMeaningfulContent :: Text -> Bool -- | Internal module of NonEmptyText, allowing breaking the abstraction. -- -- Prefer to use Data.StringVariants.NonEmptyText instead. module Data.StringVariants.NonEmptyText.Internal -- | Non Empty Text, requires the input is between 1 and n chars -- and not just whitespace. newtype NonEmptyText (n :: Nat) NonEmptyText :: Text -> NonEmptyText (n :: Nat) mkNonEmptyText :: forall n. (KnownNat n, 1 <= n) => Text -> Maybe (NonEmptyText n) mkNonEmptyTextWithTruncate :: forall n. (KnownNat n, 1 <= n) => Text -> Maybe (NonEmptyText n) -- | Make a NonEmptyText when you can manually verify the length unsafeMkNonEmptyText :: forall n. (KnownNat n, 1 <= n) => Text -> NonEmptyText n -- | Converts a NonEmptyText to a wider NonEmptyText widen :: (1 <= n, n <= m) => NonEmptyText n -> NonEmptyText m compileNonEmptyTextKnownLength :: QuasiQuoter instance Data.MonoTraversable.MonoFoldable (Data.StringVariants.NonEmptyText.Internal.NonEmptyText n) instance Data.Aeson.Types.ToJSON.ToJSON (Data.StringVariants.NonEmptyText.Internal.NonEmptyText n) instance GHC.Classes.Ord (Data.StringVariants.NonEmptyText.Internal.NonEmptyText n) instance GHC.Classes.Eq (Data.StringVariants.NonEmptyText.Internal.NonEmptyText n) instance Language.Haskell.TH.Syntax.Lift (Data.StringVariants.NonEmptyText.Internal.NonEmptyText n) instance GHC.Read.Read (Data.StringVariants.NonEmptyText.Internal.NonEmptyText n) instance GHC.Show.Show (Data.StringVariants.NonEmptyText.Internal.NonEmptyText n) instance GHC.Generics.Generic (Data.StringVariants.NonEmptyText.Internal.NonEmptyText n) instance GHC.TypeNats.KnownNat n => Data.Data.Data (Data.StringVariants.NonEmptyText.Internal.NonEmptyText n) instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Data.Aeson.Types.FromJSON.FromJSON (Data.StringVariants.NonEmptyText.Internal.NonEmptyText n) instance Data.String.Conversions.ConvertibleStrings (Data.StringVariants.NonEmptyText.Internal.NonEmptyText n) Data.Text.Internal.Text instance Data.String.Conversions.ConvertibleStrings (Data.StringVariants.NonEmptyText.Internal.NonEmptyText n) GHC.Base.String instance Data.String.Conversions.ConvertibleStrings (Data.StringVariants.NonEmptyText.Internal.NonEmptyText n) Data.ByteString.Internal.Type.ByteString instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Test.QuickCheck.Arbitrary.Arbitrary (Data.StringVariants.NonEmptyText.Internal.NonEmptyText n) instance (TypeError ...) => GHC.Base.Semigroup (Data.StringVariants.NonEmptyText.Internal.NonEmptyText n) -- | Internal module of Prose, allowing breaking the abstraction. -- -- Prefer to use Data.StringVariants.Prose instead. module Data.StringVariants.Prose.Internal -- | Whitespace-trimmed, non-empty text, for use with API endpoints. The -- rationale is that there are many situations where if a client sends -- text that is empty or all whitespace, there's probably a client error. -- Not suitable for database fields, as there is no character limit (see -- ProsePersistFieldMsg). newtype Prose Prose :: Text -> Prose mkProse :: Text -> Maybe Prose proseFromNonEmptyText :: NonEmptyText n -> Prose compileProse :: QuasiQuoter type IsProse s = (KnownSymbol s, SymbolWithNoSpaceAround s) literalProse :: forall (s :: Symbol). IsProse s => Prose proseToText :: Prose -> Text instance Data.Aeson.Types.ToJSON.ToJSONKey Data.StringVariants.Prose.Internal.Prose instance Data.Aeson.Types.ToJSON.ToJSON Data.StringVariants.Prose.Internal.Prose instance GHC.Base.Semigroup Data.StringVariants.Prose.Internal.Prose instance GHC.Show.Show Data.StringVariants.Prose.Internal.Prose instance GHC.Classes.Ord Data.StringVariants.Prose.Internal.Prose instance Language.Haskell.TH.Syntax.Lift Data.StringVariants.Prose.Internal.Prose instance GHC.Classes.Eq Data.StringVariants.Prose.Internal.Prose instance Data.String.Conversions.ConvertibleStrings Data.StringVariants.Prose.Internal.Prose Data.Text.Internal.Text instance Data.String.Conversions.ConvertibleStrings Data.StringVariants.Prose.Internal.Prose Data.Text.Internal.Lazy.Text instance Data.Aeson.Types.FromJSON.FromJSON Data.StringVariants.Prose.Internal.Prose -- | Prose type: arbitrary length non-empty text that is trimmed. module Data.StringVariants.Prose -- | Whitespace-trimmed, non-empty text, for use with API endpoints. The -- rationale is that there are many situations where if a client sends -- text that is empty or all whitespace, there's probably a client error. -- Not suitable for database fields, as there is no character limit (see -- ProsePersistFieldMsg). data Prose mkProse :: Text -> Maybe Prose compileProse :: QuasiQuoter type IsProse s = (KnownSymbol s, SymbolWithNoSpaceAround s) literalProse :: forall (s :: Symbol). IsProse s => Prose proseToText :: Prose -> Text proseFromNonEmptyText :: NonEmptyText n -> Prose module Data.StringVariants.NonEmptyText -- | Non Empty Text, requires the input is between 1 and n chars -- and not just whitespace. data NonEmptyText (n :: Nat) -- | Comparison (<=) of comparable types, as a constraint. type (x :: t) <= (y :: t) = Assert x <=? y LeErrMsg x y :: Constraint infix 4 <= mkNonEmptyText :: forall n. (KnownNat n, 1 <= n) => Text -> Maybe (NonEmptyText n) mkNonEmptyTextWithTruncate :: forall n. (KnownNat n, 1 <= n) => Text -> Maybe (NonEmptyText n) type IsNonEmptyText n s = (KnownSymbol s, KnownNat n, SymbolNonEmpty s, SymbolWithNoSpaceAround s, SymbolNoLongerThan s n) literalNonEmptyText :: forall (s :: Symbol) (n :: Nat). IsNonEmptyText n s => NonEmptyText n -- | Make a NonEmptyText when you can manually verify the length unsafeMkNonEmptyText :: forall n. (KnownNat n, 1 <= n) => Text -> NonEmptyText n compileNonEmptyText :: Integer -> QuasiQuoter compileNonEmptyTextKnownLength :: QuasiQuoter convertEmptyTextToNothing :: Text -> Maybe Text -- | Converts a NonEmptyText to a wider NonEmptyText widen :: (1 <= n, n <= m) => NonEmptyText n -> NonEmptyText m nonEmptyTextToText :: NonEmptyText n -> Text -- | Narrows the maximum length, dropping any remaining trailing -- characters. takeNonEmptyText :: forall m n. (KnownNat m, KnownNat n, 1 <= n, n <= m) => NonEmptyText m -> NonEmptyText n -- | Narrows the maximum length, dropping any prefix remaining characters. takeNonEmptyTextEnd :: forall m n. (KnownNat m, KnownNat n, 1 <= n, n <= m) => NonEmptyText m -> NonEmptyText n -- | O(n) Splits a NonEmptyText into components of length -- chunkSize. The chunks may be shorter than the chunkSize -- depending on the length of the input and spacing. Each chunk is -- stripped of whitespace. chunksOfNonEmptyText :: forall chunkSize totalSize. (KnownNat chunkSize, KnownNat totalSize, chunkSize <= totalSize, 1 <= chunkSize) => NonEmptyText totalSize -> NonEmpty (NonEmptyText chunkSize) -- | Identical to the normal text filter function, but maintains the -- type-level invariant that the text length is <= n, unlike -- unwrapping the text, filtering, then rewrapping the text. -- -- Will return Nothing if the resulting length is zero. filterNonEmptyText :: (KnownNat n, 1 <= n) => (Char -> Bool) -> NonEmptyText n -> Maybe (NonEmptyText n) -- | Concat two NonEmptyText values, with the new maximum length being the -- sum of the two maximum lengths of the inputs. -- -- Mnemonic: <> for monoid, | from NonEmpty's -- :| operator (<>|) :: NonEmptyText n -> NonEmptyText m -> NonEmptyText (n + m) -- | Concat two NonEmptyText values with a space in between them. -- The new maximum length is the sum of the two maximum lengths of the -- inputs + 1 for the space. -- -- Useful for unwordslike operations, or combining first and last -- names. concatWithSpace :: NonEmptyText n -> NonEmptyText m -> NonEmptyText ((n + m) + 1) data ContainsNonWhitespaceCharacters ContainsNonWhitespaceCharacters :: ContainsNonWhitespaceCharacters exactLengthRefinedToRange :: Refined (ContainsNonWhitespaceCharacters && SizeEqualTo n) Text -> NonEmptyText n nonEmptyTextFromRefined :: Refined (ContainsNonWhitespaceCharacters && (SizeLessThan n || SizeEqualTo n)) Text -> NonEmptyText n refinedFromNonEmptyText :: NonEmptyText n -> Refined (ContainsNonWhitespaceCharacters && (SizeLessThan n || SizeEqualTo n)) Text instance GHC.Generics.Generic Data.StringVariants.NonEmptyText.ContainsNonWhitespaceCharacters instance Refined.Predicate Data.StringVariants.NonEmptyText.ContainsNonWhitespaceCharacters Data.Text.Internal.Text module Data.StringVariants.NullableNonEmptyText -- | Newtype wrapper around Maybe NonEmptyText that converts empty string -- to Nothing. -- -- NullableNonEmptyText n is used in API types to -- represent optional text fields when you do not want an empty string to -- fail to parse. Like NonEmptyText, the payload Text is -- guaranteed to be non-empty, within the character limit, and stripped -- of whitespace. Unlike NonEmptyText, it will successfully parse -- empty strings as nullNonEmptyText. -- -- Since Aeson version 2.2, fields of this type maybe be missing, -- null, or empty without failing to parse. Avoid using -- Maybe (NullableNonEmptyText n) in API types, since it creates -- unnecessary edge cases that complicate the code. -- -- NB: When using a version of Aeson prior to 2.2, you must -- use Maybe (NullableNonEmptyText n) if you want to allow -- missing or null fields to parse. -- --
--   data Person = Person
--     { name :: NonEmptyText 50
--     , catchphrase :: NullableNonEmptyText 500
--     }
--   
--   
-- -- With this type definition, these four JSON objects below are valid and -- parse as Person Daniel nullNonEmptyText. -- --
--   {"name": "Daniel"}
--   {"name": "Daniel", catchphrase: null}
--   {"name": "Daniel", catchphrase: ""}
--   {"name": "Daniel", catchphrase: " "}
--   
-- -- These two JSON objects parses as Person Daniel -- (mkNullableNonEmptyText "Yabba-Dabba Do!") -- --
--   {"name": "Daniel", catchphrase: "Yabba-Dabba Do!"}
--   {"name": "Daniel", catchphrase: "    Yabba-Dabba Do!   "}
--   
-- -- Use nullableNonEmptyTextToMaybeNonEmptyText to extract -- Maybe (NonEmptyText n) from NullableNonEmptyText n. newtype NullableNonEmptyText n NullableNonEmptyText :: Maybe (NonEmptyText n) -> NullableNonEmptyText n mkNonEmptyTextWithTruncate :: forall n. (KnownNat n, 1 <= n) => Text -> Maybe (NonEmptyText n) compileNullableNonEmptyText :: Integer -> QuasiQuoter type IsNullableNonEmptyText n s = (KnownSymbol s, KnownNat n, SymbolNonEmpty s, SymbolWithNoSpaceAround s, SymbolNoLongerThan s n) -- | This requires the text to be non-empty. For the empty text just use -- the constructor `NullableNonEmptyText Nothing` literalNullableNonEmptyText :: forall (s :: Symbol) (n :: Nat). IsNullableNonEmptyText n s => NullableNonEmptyText n mkNullableNonEmptyText :: forall n. (KnownNat n, 1 <= n) => Text -> Maybe (NullableNonEmptyText n) parseNullableNonEmptyText :: (KnownNat n, 1 <= n) => Text -> Object -> Parser (NullableNonEmptyText n) nullNonEmptyText :: NullableNonEmptyText n maybeTextToTruncateNullableNonEmptyText :: forall n. (KnownNat n, 1 <= n) => Maybe Text -> NullableNonEmptyText n nonEmptyTextToNullable :: NonEmptyText n -> NullableNonEmptyText n maybeNonEmptyTextToNullable :: Maybe (NonEmptyText n) -> NullableNonEmptyText n nullableNonEmptyTextToMaybeText :: NullableNonEmptyText n -> Maybe Text nullableNonEmptyTextToMaybeNonEmptyText :: NullableNonEmptyText n -> Maybe (NonEmptyText n) fromMaybeNullableText :: Maybe (NullableNonEmptyText n) -> NullableNonEmptyText n isNullNonEmptyText :: NullableNonEmptyText n -> Bool instance GHC.Classes.Eq (Data.StringVariants.NullableNonEmptyText.NullableNonEmptyText n) instance Language.Haskell.TH.Syntax.Lift (Data.StringVariants.NullableNonEmptyText.NullableNonEmptyText n) instance GHC.Read.Read (Data.StringVariants.NullableNonEmptyText.NullableNonEmptyText n) instance GHC.Show.Show (Data.StringVariants.NullableNonEmptyText.NullableNonEmptyText n) instance GHC.Generics.Generic (Data.StringVariants.NullableNonEmptyText.NullableNonEmptyText n) instance Data.Aeson.Types.ToJSON.ToJSON (Data.StringVariants.NullableNonEmptyText.NullableNonEmptyText n) instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Data.Aeson.Types.FromJSON.FromJSON (Data.StringVariants.NullableNonEmptyText.NullableNonEmptyText n) module Data.StringVariants -- | Non Empty Text, requires the input is between 1 and n chars -- and not just whitespace. data NonEmptyText (n :: Nat) mkNonEmptyText :: forall n. (KnownNat n, 1 <= n) => Text -> Maybe (NonEmptyText n) -- | Make a NonEmptyText when you can manually verify the length unsafeMkNonEmptyText :: forall n. (KnownNat n, 1 <= n) => Text -> NonEmptyText n mkNonEmptyTextWithTruncate :: forall n. (KnownNat n, 1 <= n) => Text -> Maybe (NonEmptyText n) compileNonEmptyText :: Integer -> QuasiQuoter compileNonEmptyTextKnownLength :: QuasiQuoter nonEmptyTextToText :: NonEmptyText n -> Text convertEmptyTextToNothing :: Text -> Maybe Text maybeTextToTruncateNullableNonEmptyText :: forall n. (KnownNat n, 1 <= n) => Maybe Text -> NullableNonEmptyText n -- | Comparison (<=) of comparable types, as a constraint. type (x :: t) <= (y :: t) = Assert x <=? y LeErrMsg x y :: Constraint infix 4 <= -- | Converts a NonEmptyText to a wider NonEmptyText widen :: (1 <= n, n <= m) => NonEmptyText n -> NonEmptyText m -- | Narrows the maximum length, dropping any remaining trailing -- characters. takeNonEmptyText :: forall m n. (KnownNat m, KnownNat n, 1 <= n, n <= m) => NonEmptyText m -> NonEmptyText n -- | Narrows the maximum length, dropping any prefix remaining characters. takeNonEmptyTextEnd :: forall m n. (KnownNat m, KnownNat n, 1 <= n, n <= m) => NonEmptyText m -> NonEmptyText n -- | O(n) Splits a NonEmptyText into components of length -- chunkSize. The chunks may be shorter than the chunkSize -- depending on the length of the input and spacing. Each chunk is -- stripped of whitespace. chunksOfNonEmptyText :: forall chunkSize totalSize. (KnownNat chunkSize, KnownNat totalSize, chunkSize <= totalSize, 1 <= chunkSize) => NonEmptyText totalSize -> NonEmpty (NonEmptyText chunkSize) -- | Identical to the normal text filter function, but maintains the -- type-level invariant that the text length is <= n, unlike -- unwrapping the text, filtering, then rewrapping the text. -- -- Will return Nothing if the resulting length is zero. filterNonEmptyText :: (KnownNat n, 1 <= n) => (Char -> Bool) -> NonEmptyText n -> Maybe (NonEmptyText n) -- | Concat two NonEmptyText values, with the new maximum length being the -- sum of the two maximum lengths of the inputs. -- -- Mnemonic: <> for monoid, | from NonEmpty's -- :| operator (<>|) :: NonEmptyText n -> NonEmptyText m -> NonEmptyText (n + m) data ContainsNonWhitespaceCharacters ContainsNonWhitespaceCharacters :: ContainsNonWhitespaceCharacters exactLengthRefinedToRange :: Refined (ContainsNonWhitespaceCharacters && SizeEqualTo n) Text -> NonEmptyText n nonEmptyTextFromRefined :: Refined (ContainsNonWhitespaceCharacters && (SizeLessThan n || SizeEqualTo n)) Text -> NonEmptyText n refinedFromNonEmptyText :: NonEmptyText n -> Refined (ContainsNonWhitespaceCharacters && (SizeLessThan n || SizeEqualTo n)) Text -- | Whitespace-trimmed, non-empty text, for use with API endpoints. The -- rationale is that there are many situations where if a client sends -- text that is empty or all whitespace, there's probably a client error. -- Not suitable for database fields, as there is no character limit (see -- ProsePersistFieldMsg). data Prose mkProse :: Text -> Maybe Prose compileProse :: QuasiQuoter proseToText :: Prose -> Text proseFromNonEmptyText :: NonEmptyText n -> Prose -- | Newtype wrapper around Maybe NonEmptyText that converts empty string -- to Nothing. -- -- NullableNonEmptyText n is used in API types to -- represent optional text fields when you do not want an empty string to -- fail to parse. Like NonEmptyText, the payload Text is -- guaranteed to be non-empty, within the character limit, and stripped -- of whitespace. Unlike NonEmptyText, it will successfully parse -- empty strings as nullNonEmptyText. -- -- Since Aeson version 2.2, fields of this type maybe be missing, -- null, or empty without failing to parse. Avoid using -- Maybe (NullableNonEmptyText n) in API types, since it creates -- unnecessary edge cases that complicate the code. -- -- NB: When using a version of Aeson prior to 2.2, you must -- use Maybe (NullableNonEmptyText n) if you want to allow -- missing or null fields to parse. -- --
--   data Person = Person
--     { name :: NonEmptyText 50
--     , catchphrase :: NullableNonEmptyText 500
--     }
--   
--   
-- -- With this type definition, these four JSON objects below are valid and -- parse as Person Daniel nullNonEmptyText. -- --
--   {"name": "Daniel"}
--   {"name": "Daniel", catchphrase: null}
--   {"name": "Daniel", catchphrase: ""}
--   {"name": "Daniel", catchphrase: " "}
--   
-- -- These two JSON objects parses as Person Daniel -- (mkNullableNonEmptyText "Yabba-Dabba Do!") -- --
--   {"name": "Daniel", catchphrase: "Yabba-Dabba Do!"}
--   {"name": "Daniel", catchphrase: "    Yabba-Dabba Do!   "}
--   
-- -- Use nullableNonEmptyTextToMaybeNonEmptyText to extract -- Maybe (NonEmptyText n) from NullableNonEmptyText n. newtype NullableNonEmptyText n NullableNonEmptyText :: Maybe (NonEmptyText n) -> NullableNonEmptyText n mkNullableNonEmptyText :: forall n. (KnownNat n, 1 <= n) => Text -> Maybe (NullableNonEmptyText n) nullNonEmptyText :: NullableNonEmptyText n compileNullableNonEmptyText :: Integer -> QuasiQuoter nonEmptyTextToNullable :: NonEmptyText n -> NullableNonEmptyText n maybeNonEmptyTextToNullable :: Maybe (NonEmptyText n) -> NullableNonEmptyText n nullableNonEmptyTextToMaybeText :: NullableNonEmptyText n -> Maybe Text nullableNonEmptyTextToMaybeNonEmptyText :: NullableNonEmptyText n -> Maybe (NonEmptyText n) parseNullableNonEmptyText :: (KnownNat n, 1 <= n) => Text -> Object -> Parser (NullableNonEmptyText n) fromMaybeNullableText :: Maybe (NullableNonEmptyText n) -> NullableNonEmptyText n isNullNonEmptyText :: NullableNonEmptyText n -> Bool