packages feed

postgresql-connection-string 0.1.0.2 → 0.1.0.3

raw patch · 16 files changed

+305/−333 lines, 16 files

Files

postgresql-connection-string.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: postgresql-connection-string-version: 0.1.0.2+version: 0.1.0.3 category: Database, PostgreSQL synopsis: PostgreSQL connection string type, parser and builder description:@@ -99,57 +99,26 @@     PostgresqlConnectionString    other-modules:-    PostgresqlConnectionString.Charsets-    PostgresqlConnectionString.Parsers-    PostgresqlConnectionString.Types-    PostgresqlConnectionString.Types.Gens--  build-depends:-    QuickCheck >=2.14 && <2.16,-    charset ^>=0.3.12,-    containers >=0.6 && <0.9,-    megaparsec >=9.2.1 && <10.0,-    postgresql-connection-string:percent-encoding,-    postgresql-connection-string:platform,-    text >=1.2 && <3,-    text-builder >=1 && <1.1,---- Replacement of the "base" library for all the sublibs here.--- Covers such things as Prelude and shared utils.-library platform-  import: base-  visibility: private-  hs-source-dirs: src/platform-  exposed-modules:-    Platform.Prelude--  build-depends:-    base >=4.13 && <5,-    bytestring >=0.10 && <0.13,-    hashable >=1.2 && <2,-    text >=1.2 && <3,-    text-builder >=1 && <1.1,--library percent-encoding-  import: base-  visibility: private-  hs-source-dirs: src/percent-encoding-  exposed-modules:     PercentEncoding--  other-modules:     PercentEncoding.Charsets     PercentEncoding.MonadPlus     PercentEncoding.Parsers     PercentEncoding.TextBuilders     PercentEncoding.Utf8CharView+    Platform.Prelude+    PostgresqlConnectionString.Charsets+    PostgresqlConnectionString.Parsers+    PostgresqlConnectionString.Types+    PostgresqlConnectionString.Types.Gens    build-depends:+    QuickCheck >=2.14 && <2.16,     base >=4.13 && <5,     bytestring >=0.10 && <0.13,     charset ^>=0.3.12,+    containers >=0.6 && <0.9,+    hashable >=1.2 && <2,     megaparsec >=9.2.1 && <10.0,-    postgresql-connection-string:platform,     text >=1.2 && <3,     text-builder >=1 && <1.1, @@ -160,9 +129,9 @@   main-is: Main.hs   build-depends:     QuickCheck >=2.14 && <2.16,+    base >=4.13 && <5,     containers >=0.6 && <0.9,     hspec ^>=2.11.12,     postgresql-connection-string,-    postgresql-connection-string:platform,     quickcheck-classes >=0.6.5 && <0.7,     text >=1.2 && <3,
src/library-tests/Main.hs view
@@ -1,12 +1,16 @@ module Main where +import Control.Monad+import Data.Either+import Data.Function import qualified Data.Map.Strict as Map+import Data.Proxy import qualified Data.Text as Text-import Platform.Prelude import qualified PostgresqlConnectionString as ConnectionString import Test.Hspec import Test.QuickCheck import qualified Test.QuickCheck.Classes as Laws+import Prelude  main :: IO () main = hspec do@@ -23,8 +27,7 @@       it "generates valid postgresql:// URLs" do         property \connStr ->           let url = ConnectionString.toUrl connStr-              urlStr = Text.unpack url-           in (url `elem` ["postgresql://", "postgres://"] || "postgresql://" `isPrefixOf` urlStr)+           in (url `elem` ["postgresql://", "postgres://"] || "postgresql://" `Text.isPrefixOf` url)                 & counterexample ("Generated URL: " <> Text.unpack url)        it "encodes user correctly" do
+ src/library/PercentEncoding.hs view
@@ -0,0 +1,17 @@+module PercentEncoding where++import qualified PercentEncoding.Parsers as Parsers+import qualified PercentEncoding.TextBuilders as TextBuilders+import Platform.Prelude+import qualified Text.Megaparsec as Megaparsec++encodeText :: Text -> TextBuilder+encodeText = TextBuilders.urlEncodedText++parser ::+  -- | Test on stop-char. @%@ is already accounted for.+  (Char -> Bool) ->+  -- | Megaparsec parser for a percent-encoded text component.+  Megaparsec.Parsec Void Text Text+parser isStopChar =+  Parsers.urlEncodedComponentText isStopChar
+ src/library/PercentEncoding/Charsets.hs view
@@ -0,0 +1,24 @@+module PercentEncoding.Charsets where++import Data.CharSet+import Platform.Prelude hiding (fromList)++-- | Characters which don't need to be percent-encoded in URLs.+{-# NOINLINE passthrough #-}+passthrough :: CharSet+passthrough =+  mconcat+    [ lowerAsciiAlpha,+      upperAsciiAlpha,+      digit,+      fromList ['-', '.', '_', '~']+    ]++lowerAsciiAlpha :: CharSet+lowerAsciiAlpha = fromDistinctAscList ['a' .. 'z']++upperAsciiAlpha :: CharSet+upperAsciiAlpha = fromDistinctAscList ['A' .. 'Z']++digit :: CharSet+digit = fromDistinctAscList ['0' .. '9']
+ src/library/PercentEncoding/MonadPlus.hs view
@@ -0,0 +1,41 @@+module PercentEncoding.MonadPlus where++import Platform.Prelude hiding (scanl)++{-# INLINE scanl #-}+scanl :: (MonadPlus m) => (a -> b -> a) -> a -> m b -> m a+scanl step start subaction =+  loop start+  where+    loop state =+      mplus+        ( do+            element <- subaction+            loop $! step state element+        )+        (return state)++{-# INLINE scanl1 #-}+scanl1 :: (MonadPlus m) => (a -> a -> a) -> m a -> m a+scanl1 step subaction = do+  start <- subaction+  scanl step start subaction++{-# INLINE scanlM #-}+scanlM :: (MonadPlus m) => (a -> b -> m a) -> a -> m b -> m a+scanlM step start subaction =+  loop start+  where+    loop state =+      join+        ( mplus+            ( do+                element <- subaction+                return (step state element >>= loop)+            )+            (return (return state))+        )++{-# INLINE scan #-}+scan :: (MonadPlus m, Monoid a) => m a -> m a+scan = scanl mappend mempty
+ src/library/PercentEncoding/Parsers.hs view
@@ -0,0 +1,78 @@+module PercentEncoding.Parsers where++import qualified Control.Exception as Exception+import qualified Data.ByteString as ByteString+import qualified Data.Text.Encoding as Text.Encoding+import qualified Data.Text.Encoding.Error as Text.Encoding+import qualified PercentEncoding.MonadPlus as MonadPlus+import Platform.Prelude hiding (try)+import Text.Megaparsec+import Text.Megaparsec.Char+import qualified TextBuilder as TextBuilder++type Parser = Parsec Void Text++{-# INLINEABLE urlEncodedComponentText #-}+urlEncodedComponentText :: (Char -> Bool) -> Parser Text+urlEncodedComponentText stopCharPredicate =+  labeled "URL-encoded component"+    $ fmap TextBuilder.toText+    $ MonadPlus.scanl1 mappend+    $ parser+  where+    parser =+      asum+        [ TextBuilder.text <$> try (takeWhile1P (Just "Unencoded char") unencodedCharPredicate),+          urlEncodedSequenceTextBuilder+        ]+      where+        unencodedCharPredicate c =+          not (c == '%' || stopCharPredicate c)++{-# INLINEABLE urlEncodedSequenceTextBuilder #-}+urlEncodedSequenceTextBuilder :: Parser TextBuilder.TextBuilder+urlEncodedSequenceTextBuilder =+  labeled "URL-encoded sequence" $ do+    start <- progress (mempty, mempty, Text.Encoding.streamDecodeUtf8) =<< urlEncodedByte+    MonadPlus.scanlM progress start urlEncodedByte >>= finish+  where+    progress (!builder, _ :: ByteString, decode) byte =+      case unsafeDupablePerformIO (Exception.try (evaluate (decode (ByteString.singleton byte)))) of+        Right (Text.Encoding.Some decodedChunk undecodedBytes newDecode) ->+          return (builder <> TextBuilder.text decodedChunk, undecodedBytes, newDecode)+        Left (Text.Encoding.DecodeError error _) ->+          fail (showString "UTF8 decoding: " error)+        Left _ ->+          fail "Unexpected decoding error"+    finish (builder, undecodedBytes, _) =+      if ByteString.null undecodedBytes+        then return builder+        else fail (showString "UTF8 decoding: Bytes remaining: " (show undecodedBytes))++{-# INLINE urlEncodedByte #-}+urlEncodedByte :: Parser Word8+urlEncodedByte = do+  _ <- try (char '%')+  digit1 <- fromIntegral <$> hexadecimalDigit+  digit2 <- fromIntegral <$> hexadecimalDigit+  return (shiftL digit1 4 .|. digit2)++{-# INLINE hexadecimalDigit #-}+hexadecimalDigit :: Parser Int+hexadecimalDigit = label "Hex digit" do+  c <- anySingle+  let x = ord c+  if x >= 48 && x < 58+    then return (x - 48)+    else+      if x >= 65 && x < 71+        then return (x - 55)+        else+          if x >= 97 && x < 103+            then return (x - 87)+            else fail ("Not a hexadecimal digit: " <> show c)++{-# INLINE labeled #-}+labeled :: String -> Parser a -> Parser a+labeled label parser =+  parser <?> label
+ src/library/PercentEncoding/TextBuilders.hs view
@@ -0,0 +1,36 @@+module PercentEncoding.TextBuilders where++import qualified Data.CharSet as CharSet+import qualified Data.Text as Text+import qualified PercentEncoding.Charsets as Charsets+import qualified PercentEncoding.Utf8CharView as Utf8CharView+import Platform.Prelude+import TextBuilder++-- | Apply URL-encoding to text+urlEncodedText :: Text -> TextBuilder+urlEncodedText =+  foldMap urlEncodedChar . Text.unpack++urlEncodedChar :: Char -> TextBuilder+urlEncodedChar c =+  if CharSet.member c Charsets.passthrough+    then char c+    else+      Utf8CharView.char+        c+        ( \b1 ->+            urlEncodedByte b1+        )+        ( \b1 b2 ->+            urlEncodedByte b1 <> urlEncodedByte b2+        )+        ( \b1 b2 b3 ->+            mconcat [urlEncodedByte b1, urlEncodedByte b2, urlEncodedByte b3]+        )+        ( \b1 b2 b3 b4 ->+            mconcat [urlEncodedByte b1, urlEncodedByte b2, urlEncodedByte b3, urlEncodedByte b4]+        )++urlEncodedByte :: Word8 -> TextBuilder+urlEncodedByte x = char '%' <> hexadecimal x
+ src/library/PercentEncoding/Utf8CharView.hs view
@@ -0,0 +1,45 @@+-- |+-- Utilities for the UTF-8 encoding.+module PercentEncoding.Utf8CharView where++import Platform.Prelude++-- |+-- Church encoding of a UTF8-encoded character.+type Utf8CharView =+  forall a.+  (Word8 -> a) ->+  (Word8 -> Word8 -> a) ->+  (Word8 -> Word8 -> Word8 -> a) ->+  (Word8 -> Word8 -> Word8 -> Word8 -> a) ->+  a++{-# INLINE char #-}+char :: Char -> Utf8CharView+char a =+  codepoint (ord a)++{-# INLINE codepoint #-}+codepoint :: Int -> Utf8CharView+codepoint x f1 f2 f3 f4 =+  if x <= 0x7F+    then f1 (fromIntegral x)+    else+      if x <= 0x07FF+        then+          f2+            (fromIntegral ((x `unsafeShiftR` 6) + 0xC0))+            (fromIntegral ((x .&. 0x3F) + 0x80))+        else+          if x <= 0xFFFF+            then+              f3+                (fromIntegral (x `unsafeShiftR` 12) + 0xE0)+                (fromIntegral ((x `unsafeShiftR` 6) .&. 0x3F) + 0x80)+                (fromIntegral (x .&. 0x3F) + 0x80)+            else+              f4+                (fromIntegral (x `unsafeShiftR` 18) + 0xF0)+                (fromIntegral ((x `unsafeShiftR` 12) .&. 0x3F) + 0x80)+                (fromIntegral ((x `unsafeShiftR` 6) .&. 0x3F) + 0x80)+                (fromIntegral (x .&. 0x3F) + 0x80)
+ src/library/Platform/Prelude.hs view
@@ -0,0 +1,48 @@+module Platform.Prelude+  ( module Exports,+  )+where++import Control.Applicative as Exports hiding (WrappedArrow (..))+import Control.Arrow as Exports hiding (first, second)+import Control.Category as Exports+import Control.Exception as Exports hiding (Handler)+import Control.Monad as Exports hiding (fail, forM, forM_, mapM, mapM_, msum, sequence, sequence_)+import Control.Monad.Fail as Exports+import Control.Monad.Fix as Exports hiding (fix)+import Control.Monad.IO.Class as Exports+import Data.Bifunctor as Exports+import Data.Bits as Exports+import Data.Bool as Exports+import Data.ByteString as Exports (ByteString)+import Data.Char as Exports+import Data.Coerce as Exports+import Data.Data as Exports+import Data.Either as Exports+import Data.Foldable as Exports hiding (toList)+import Data.Function as Exports hiding (id, (.))+import Data.Functor as Exports hiding (unzip)+import Data.Functor.Compose as Exports+import Data.Functor.Identity as Exports+import Data.Hashable as Exports (Hashable (..))+import Data.Int as Exports+import Data.List as Exports hiding (all, and, any, concat, concatMap, elem, filter, find, foldl, foldl', foldl1, foldr, foldr1, isSubsequenceOf, mapAccumL, mapAccumR, maximum, maximumBy, minimum, minimumBy, notElem, or, product, sortOn, sum, uncons)+import Data.List.NonEmpty as Exports (NonEmpty (..))+import Data.Maybe as Exports hiding (mapMaybe)+import Data.Monoid as Exports hiding (Alt, (<>))+import Data.Ord as Exports+import Data.Semigroup as Exports hiding (First (..), Last (..))+import Data.String as Exports+import Data.Text as Exports (Text)+import Data.Traversable as Exports+import Data.Tuple as Exports+import Data.Void as Exports+import Data.Word as Exports+import GHC.Exts as Exports (IsList (..), groupWith, inline, lazy, sortWith)+import GHC.Generics as Exports (Generic)+import GHC.OverloadedLabels as Exports+import Numeric as Exports+import System.IO as Exports (Handle, hClose)+import System.IO.Unsafe as Exports (unsafeDupablePerformIO)+import TextBuilder as Exports (TextBuilder)+import Prelude as Exports hiding (Read, all, and, any, concat, concatMap, elem, fail, filter, foldl, foldl1, foldr, foldr1, id, mapM, mapM_, maximum, minimum, notElem, or, product, sequence, sequence_, sum, (.))
− src/percent-encoding/PercentEncoding.hs
@@ -1,17 +0,0 @@-module PercentEncoding where--import qualified PercentEncoding.Parsers as Parsers-import qualified PercentEncoding.TextBuilders as TextBuilders-import Platform.Prelude-import qualified Text.Megaparsec as Megaparsec--encodeText :: Text -> TextBuilder-encodeText = TextBuilders.urlEncodedText--parser ::-  -- | Test on stop-char. @%@ is already accounted for.-  (Char -> Bool) ->-  -- | Megaparsec parser for a percent-encoded text component.-  Megaparsec.Parsec Void Text Text-parser isStopChar =-  Parsers.urlEncodedComponentText isStopChar
− src/percent-encoding/PercentEncoding/Charsets.hs
@@ -1,24 +0,0 @@-module PercentEncoding.Charsets where--import Data.CharSet-import Platform.Prelude hiding (fromList)---- | Characters which don't need to be percent-encoded in URLs.-{-# NOINLINE passthrough #-}-passthrough :: CharSet-passthrough =-  mconcat-    [ lowerAsciiAlpha,-      upperAsciiAlpha,-      digit,-      fromList ['-', '.', '_', '~']-    ]--lowerAsciiAlpha :: CharSet-lowerAsciiAlpha = fromDistinctAscList ['a' .. 'z']--upperAsciiAlpha :: CharSet-upperAsciiAlpha = fromDistinctAscList ['A' .. 'Z']--digit :: CharSet-digit = fromDistinctAscList ['0' .. '9']
− src/percent-encoding/PercentEncoding/MonadPlus.hs
@@ -1,41 +0,0 @@-module PercentEncoding.MonadPlus where--import Platform.Prelude hiding (scanl)--{-# INLINE scanl #-}-scanl :: (MonadPlus m) => (a -> b -> a) -> a -> m b -> m a-scanl step start subaction =-  loop start-  where-    loop state =-      mplus-        ( do-            element <- subaction-            loop $! step state element-        )-        (return state)--{-# INLINE scanl1 #-}-scanl1 :: (MonadPlus m) => (a -> a -> a) -> m a -> m a-scanl1 step subaction = do-  start <- subaction-  scanl step start subaction--{-# INLINE scanlM #-}-scanlM :: (MonadPlus m) => (a -> b -> m a) -> a -> m b -> m a-scanlM step start subaction =-  loop start-  where-    loop state =-      join-        ( mplus-            ( do-                element <- subaction-                return (step state element >>= loop)-            )-            (return (return state))-        )--{-# INLINE scan #-}-scan :: (MonadPlus m, Monoid a) => m a -> m a-scan = scanl mappend mempty
− src/percent-encoding/PercentEncoding/Parsers.hs
@@ -1,78 +0,0 @@-module PercentEncoding.Parsers where--import qualified Control.Exception as Exception-import qualified Data.ByteString as ByteString-import qualified Data.Text.Encoding as Text.Encoding-import qualified Data.Text.Encoding.Error as Text.Encoding-import qualified PercentEncoding.MonadPlus as MonadPlus-import Platform.Prelude hiding (try)-import Text.Megaparsec-import Text.Megaparsec.Char-import qualified TextBuilder as TextBuilder--type Parser = Parsec Void Text--{-# INLINEABLE urlEncodedComponentText #-}-urlEncodedComponentText :: (Char -> Bool) -> Parser Text-urlEncodedComponentText stopCharPredicate =-  labeled "URL-encoded component"-    $ fmap TextBuilder.toText-    $ MonadPlus.scanl1 mappend-    $ parser-  where-    parser =-      asum-        [ TextBuilder.text <$> try (takeWhile1P (Just "Unencoded char") unencodedCharPredicate),-          urlEncodedSequenceTextBuilder-        ]-      where-        unencodedCharPredicate c =-          not (c == '%' || stopCharPredicate c)--{-# INLINEABLE urlEncodedSequenceTextBuilder #-}-urlEncodedSequenceTextBuilder :: Parser TextBuilder.TextBuilder-urlEncodedSequenceTextBuilder =-  labeled "URL-encoded sequence" $ do-    start <- progress (mempty, mempty, Text.Encoding.streamDecodeUtf8) =<< urlEncodedByte-    MonadPlus.scanlM progress start urlEncodedByte >>= finish-  where-    progress (!builder, _ :: ByteString, decode) byte =-      case unsafeDupablePerformIO (Exception.try (evaluate (decode (ByteString.singleton byte)))) of-        Right (Text.Encoding.Some decodedChunk undecodedBytes newDecode) ->-          return (builder <> TextBuilder.text decodedChunk, undecodedBytes, newDecode)-        Left (Text.Encoding.DecodeError error _) ->-          fail (showString "UTF8 decoding: " error)-        Left _ ->-          fail "Unexpected decoding error"-    finish (builder, undecodedBytes, _) =-      if ByteString.null undecodedBytes-        then return builder-        else fail (showString "UTF8 decoding: Bytes remaining: " (show undecodedBytes))--{-# INLINE urlEncodedByte #-}-urlEncodedByte :: Parser Word8-urlEncodedByte = do-  _ <- try (char '%')-  digit1 <- fromIntegral <$> hexadecimalDigit-  digit2 <- fromIntegral <$> hexadecimalDigit-  return (shiftL digit1 4 .|. digit2)--{-# INLINE hexadecimalDigit #-}-hexadecimalDigit :: Parser Int-hexadecimalDigit = label "Hex digit" do-  c <- anySingle-  let x = ord c-  if x >= 48 && x < 58-    then return (x - 48)-    else-      if x >= 65 && x < 71-        then return (x - 55)-        else-          if x >= 97 && x < 103-            then return (x - 87)-            else fail ("Not a hexadecimal digit: " <> show c)--{-# INLINE labeled #-}-labeled :: String -> Parser a -> Parser a-labeled label parser =-  parser <?> label
− src/percent-encoding/PercentEncoding/TextBuilders.hs
@@ -1,36 +0,0 @@-module PercentEncoding.TextBuilders where--import qualified Data.CharSet as CharSet-import qualified Data.Text as Text-import qualified PercentEncoding.Charsets as Charsets-import qualified PercentEncoding.Utf8CharView as Utf8CharView-import Platform.Prelude-import TextBuilder---- | Apply URL-encoding to text-urlEncodedText :: Text -> TextBuilder-urlEncodedText =-  foldMap urlEncodedChar . Text.unpack--urlEncodedChar :: Char -> TextBuilder-urlEncodedChar c =-  if CharSet.member c Charsets.passthrough-    then char c-    else-      Utf8CharView.char-        c-        ( \b1 ->-            urlEncodedByte b1-        )-        ( \b1 b2 ->-            urlEncodedByte b1 <> urlEncodedByte b2-        )-        ( \b1 b2 b3 ->-            mconcat [urlEncodedByte b1, urlEncodedByte b2, urlEncodedByte b3]-        )-        ( \b1 b2 b3 b4 ->-            mconcat [urlEncodedByte b1, urlEncodedByte b2, urlEncodedByte b3, urlEncodedByte b4]-        )--urlEncodedByte :: Word8 -> TextBuilder-urlEncodedByte x = char '%' <> hexadecimal x
− src/percent-encoding/PercentEncoding/Utf8CharView.hs
@@ -1,45 +0,0 @@--- |--- Utilities for the UTF-8 encoding.-module PercentEncoding.Utf8CharView where--import Platform.Prelude---- |--- Church encoding of a UTF8-encoded character.-type Utf8CharView =-  forall a.-  (Word8 -> a) ->-  (Word8 -> Word8 -> a) ->-  (Word8 -> Word8 -> Word8 -> a) ->-  (Word8 -> Word8 -> Word8 -> Word8 -> a) ->-  a--{-# INLINE char #-}-char :: Char -> Utf8CharView-char a =-  codepoint (ord a)--{-# INLINE codepoint #-}-codepoint :: Int -> Utf8CharView-codepoint x f1 f2 f3 f4 =-  if x <= 0x7F-    then f1 (fromIntegral x)-    else-      if x <= 0x07FF-        then-          f2-            (fromIntegral ((x `unsafeShiftR` 6) + 0xC0))-            (fromIntegral ((x .&. 0x3F) + 0x80))-        else-          if x <= 0xFFFF-            then-              f3-                (fromIntegral (x `unsafeShiftR` 12) + 0xE0)-                (fromIntegral ((x `unsafeShiftR` 6) .&. 0x3F) + 0x80)-                (fromIntegral (x .&. 0x3F) + 0x80)-            else-              f4-                (fromIntegral (x `unsafeShiftR` 18) + 0xF0)-                (fromIntegral ((x `unsafeShiftR` 12) .&. 0x3F) + 0x80)-                (fromIntegral ((x `unsafeShiftR` 6) .&. 0x3F) + 0x80)-                (fromIntegral (x .&. 0x3F) + 0x80)
− src/platform/Platform/Prelude.hs
@@ -1,48 +0,0 @@-module Platform.Prelude-  ( module Exports,-  )-where--import Control.Applicative as Exports hiding (WrappedArrow (..))-import Control.Arrow as Exports hiding (first, second)-import Control.Category as Exports-import Control.Exception as Exports hiding (Handler)-import Control.Monad as Exports hiding (fail, forM, forM_, mapM, mapM_, msum, sequence, sequence_)-import Control.Monad.Fail as Exports-import Control.Monad.Fix as Exports hiding (fix)-import Control.Monad.IO.Class as Exports-import Data.Bifunctor as Exports-import Data.Bits as Exports-import Data.Bool as Exports-import Data.ByteString as Exports (ByteString)-import Data.Char as Exports-import Data.Coerce as Exports-import Data.Data as Exports-import Data.Either as Exports-import Data.Foldable as Exports hiding (toList)-import Data.Function as Exports hiding (id, (.))-import Data.Functor as Exports hiding (unzip)-import Data.Functor.Compose as Exports-import Data.Functor.Identity as Exports-import Data.Hashable as Exports (Hashable (..))-import Data.Int as Exports-import Data.List as Exports hiding (all, and, any, concat, concatMap, elem, filter, find, foldl, foldl', foldl1, foldr, foldr1, isSubsequenceOf, mapAccumL, mapAccumR, maximum, maximumBy, minimum, minimumBy, notElem, or, product, sortOn, sum, uncons)-import Data.List.NonEmpty as Exports (NonEmpty (..))-import Data.Maybe as Exports hiding (mapMaybe)-import Data.Monoid as Exports hiding (Alt, (<>))-import Data.Ord as Exports-import Data.Semigroup as Exports hiding (First (..), Last (..))-import Data.String as Exports-import Data.Text as Exports (Text)-import Data.Traversable as Exports-import Data.Tuple as Exports-import Data.Void as Exports-import Data.Word as Exports-import GHC.Exts as Exports (IsList (..), groupWith, inline, lazy, sortWith)-import GHC.Generics as Exports (Generic)-import GHC.OverloadedLabels as Exports-import Numeric as Exports-import System.IO as Exports (Handle, hClose)-import System.IO.Unsafe as Exports (unsafeDupablePerformIO)-import TextBuilder as Exports (TextBuilder)-import Prelude as Exports hiding (Read, all, and, any, concat, concatMap, elem, fail, filter, foldl, foldl1, foldr, foldr1, id, mapM, mapM_, maximum, minimum, notElem, or, product, sequence, sequence_, sum, (.))