-- 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.2.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 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 compileProse :: QuasiQuoter literalProse :: forall (s :: Symbol). (KnownSymbol s, SymbolWithNoSpaceAround 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 literalProse :: forall (s :: Symbol). (KnownSymbol s, SymbolWithNoSpaceAround s) => Prose proseToText :: Prose -> Text -- | 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 GHC.Base.Semigroup (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, 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.ByteString instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Test.QuickCheck.Arbitrary.Arbitrary (Data.StringVariants.NonEmptyText.Internal.NonEmptyText n) 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 :: k) <= (y :: k) = x <=? y ~ 'True infix 4 <= mkNonEmptyText :: forall n. (KnownNat n, 1 <= n) => Text -> Maybe (NonEmptyText n) mkNonEmptyTextWithTruncate :: forall n. (KnownNat n, 1 <= n) => Text -> Maybe (NonEmptyText n) literalNonEmptyText :: forall (s :: Symbol) (n :: Nat). (KnownSymbol s, KnownNat n, SymbolNonEmpty s, SymbolWithNoSpaceAround s, SymbolNoLongerThan s n) => NonEmptyText n -- | Make a NonEmptyText when you can manually verify the length unsafeMkNonEmptyText :: forall n. (KnownNat n, 1 <= n) => Text -> NonEmptyText n nonEmptyTextToText :: NonEmptyText n -> Text 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 -- | 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. -- -- This is aimed primarily at JSON parsing: make it possible to parse -- empty string and turn it into Nothing, in order to convert -- everything into Maybe NonEmptyText at the edge of the system. -- -- While using this for JSON parsing, use Maybe -- NullableNonEmptyText. Aeson special-cases Maybe to allow -- nulls, so Maybe catches the nulls and -- NullableNonEmptyText catches the empty strings. -- -- To extract Maybe NonEmptyText values from Maybe -- NullableNonEmptyText, use -- nullableNonEmptyTextToMaybeNonEmptyText. newtype NullableNonEmptyText n NullableNonEmptyText :: Maybe (NonEmptyText n) -> NullableNonEmptyText n mkNonEmptyTextWithTruncate :: forall n. (KnownNat n, 1 <= n) => Text -> Maybe (NonEmptyText n) compileNullableNonEmptyText :: Integer -> QuasiQuoter -- | This requires the text to be non-empty. For the empty text just use -- the constructor `NullableNonEmptyText Nothing` literalNullableNonEmptyText :: forall (s :: Symbol) (n :: Nat). (KnownSymbol s, KnownNat n, SymbolNonEmpty s, SymbolWithNoSpaceAround s, SymbolNoLongerThan s n) => 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 Data.Aeson.Types.ToJSON.ToJSON (Data.StringVariants.NullableNonEmptyText.NullableNonEmptyText n) 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 (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 :: k) <= (y :: k) = x <=? y ~ 'True 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 -- | Newtype wrapper around Maybe NonEmptyText that converts empty string -- to Nothing. -- -- This is aimed primarily at JSON parsing: make it possible to parse -- empty string and turn it into Nothing, in order to convert -- everything into Maybe NonEmptyText at the edge of the system. -- -- While using this for JSON parsing, use Maybe -- NullableNonEmptyText. Aeson special-cases Maybe to allow -- nulls, so Maybe catches the nulls and -- NullableNonEmptyText catches the empty strings. -- -- To extract Maybe NonEmptyText values from Maybe -- NullableNonEmptyText, use -- nullableNonEmptyTextToMaybeNonEmptyText. 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