base64-bytestring-type 1 → 1.0.1
raw patch · 7 files changed
+331/−69 lines, 7 filesdep +http-api-datadep +serialisedep −ghc-primdep ~QuickCheckdep ~aesondep ~basePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: http-api-data, serialise
Dependencies removed: ghc-prim
Dependency ranges changed: QuickCheck, aeson, base, base-compat, base64-bytestring, binary, bytestring, deepseq, hashable, semigroups, tasty, tasty-quickcheck, text
API changes (from Hackage documentation)
- Data.ByteString.Base64.Lazy.Type: instance Data.Semigroup.Semigroup Data.ByteString.Base64.Lazy.Type.ByteString64
- Data.ByteString.Base64.Type: instance Data.Semigroup.Semigroup Data.ByteString.Base64.Type.ByteString64
- Data.ByteString.Base64.URL.Lazy.Type: instance Data.Semigroup.Semigroup Data.ByteString.Base64.URL.Lazy.Type.ByteString64
- Data.ByteString.Base64.URL.Type: instance Data.Semigroup.Semigroup Data.ByteString.Base64.URL.Type.ByteString64
+ Data.ByteString.Base64.Lazy.Type: instance Codec.Serialise.Class.Serialise Data.ByteString.Base64.Lazy.Type.ByteString64
+ Data.ByteString.Base64.Lazy.Type: instance GHC.Base.Semigroup Data.ByteString.Base64.Lazy.Type.ByteString64
+ Data.ByteString.Base64.Type: instance Codec.Serialise.Class.Serialise Data.ByteString.Base64.Type.ByteString64
+ Data.ByteString.Base64.Type: instance GHC.Base.Semigroup Data.ByteString.Base64.Type.ByteString64
+ Data.ByteString.Base64.Type: instance Web.Internal.HttpApiData.FromHttpApiData Data.ByteString.Base64.Type.ByteString64
+ Data.ByteString.Base64.Type: instance Web.Internal.HttpApiData.ToHttpApiData Data.ByteString.Base64.Type.ByteString64
+ Data.ByteString.Base64.URL.Lazy.Type: instance Codec.Serialise.Class.Serialise Data.ByteString.Base64.URL.Lazy.Type.ByteString64
+ Data.ByteString.Base64.URL.Lazy.Type: instance GHC.Base.Semigroup Data.ByteString.Base64.URL.Lazy.Type.ByteString64
+ Data.ByteString.Base64.URL.Type: instance Codec.Serialise.Class.Serialise Data.ByteString.Base64.URL.Type.ByteString64
+ Data.ByteString.Base64.URL.Type: instance GHC.Base.Semigroup Data.ByteString.Base64.URL.Type.ByteString64
+ Data.ByteString.Base64.URL.Type: instance Web.Internal.HttpApiData.FromHttpApiData Data.ByteString.Base64.URL.Type.ByteString64
+ Data.ByteString.Base64.URL.Type: instance Web.Internal.HttpApiData.ToHttpApiData Data.ByteString.Base64.URL.Type.ByteString64
Files
- CHANGELOG.md +4/−0
- base64-bytestring-type.cabal +82/−55
- src/Data/ByteString/Base64/Lazy/Type.hs +28/−3
- src/Data/ByteString/Base64/Type.hs +56/−1
- src/Data/ByteString/Base64/URL/Lazy/Type.hs +30/−5
- src/Data/ByteString/Base64/URL/Type.hs +53/−1
- test/Tests.hs +78/−4
+ CHANGELOG.md view
@@ -0,0 +1,4 @@+1.0.1+-----++Add `serialise` and `http-api-data` instances.
base64-bytestring-type.cabal view
@@ -1,88 +1,115 @@-name: base64-bytestring-type-version: 1-synopsis: A newtype around ByteString, for base64 encoding+cabal-version: 1.12+name: base64-bytestring-type+version: 1.0.1+synopsis: A newtype around ByteString, for base64 encoding description: A newtype around ByteString, for base64 encoding. Strict and lazy, normal and url alphabet variants.-category: Web-homepage: https://github.com/futurice/haskell-base64-bytestring-type#readme-bug-reports: https://github.com/futurice/haskell-base64-bytestring-type/issues-author: Oleg Grenrus <oleg.grenrus@iki.fi>-maintainer: Oleg Grenrus <oleg.grenrus@iki.fi>-license: BSD3-license-file: LICENSE-build-type: Simple-cabal-version: 1.12++category: Data+homepage:+ https://github.com/futurice/haskell-base64-bytestring-type#readme++bug-reports:+ https://github.com/futurice/haskell-base64-bytestring-type/issues++author: Oleg Grenrus <oleg.grenrus@iki.fi>+maintainer: Oleg Grenrus <oleg.grenrus@iki.fi>+license: BSD3+license-file: LICENSE+build-type: Simple tested-with:- GHC==7.4.2,- GHC==7.6.3,- GHC==7.8.4,- GHC==7.10.3,- GHC==8.0.2,- GHC==8.2.2,- GHC==8.4.1+ GHC ==8.6.4 || ==8.4.4 || ==8.2.2 || ==8.0.2 || ==7.10.3 || ==7.8.4 -extra-source-files:- README.md+extra-source-files: README.md CHANGELOG.md source-repository head- type: git+ type: git location: https://github.com/futurice/haskell-base64-bytestring-type +flag cereal+ description: Instances for @Serialize@ from @cereal@ package+ manual: True+ default: True++flag serialise+ description: Instances for @Serialise@ from @serialise@ package+ manual: True+ default: True++flag http-api-data+ description:+ Instances for @To/FromHttpApiData@ from @http-api-data@ package++ manual: True+ default: True+ library- hs-source-dirs:- src- ghc-options: -Wall+ hs-source-dirs: src+ ghc-options: -Wall -- boot libraries -- https://ghc.haskell.org/trac/ghc/wiki/Commentary/Libraries/VersionHistory build-depends:- base >=4.5.1.0 && <4.11- , binary >=0.5.1.0 && <0.10- , bytestring >=0.9.2.1 && <0.11- , deepseq >=1.3.0.0 && <1.5- , text >=1.2.3.0 && <1.3+ base >=4.7.0.0 && <4.13+ , binary >=0.7.1.0 && <0.10+ , bytestring >=0.10.4.0 && <0.11+ , deepseq >=1.3.0.2 && <1.5+ , text >=1.2.3.0 && <1.3 -- other dependencies: build-depends:- aeson >=1.2.3.0 && <1.3- , base-compat >=0.9.3 && <0.10- , base64-bytestring >=1.0.0.1 && <1.1- , cereal >=0.5.5.0 && <0.6- , hashable >=1.2.6.1 && <1.3- , QuickCheck >=2.11.3 && <2.12+ aeson >=1.2.3.0 && <1.5+ , base-compat >=0.9.3 && <0.11+ , base64-bytestring >=1.0.0.1 && <1.1+ , hashable >=1.2.6.1 && <1.3+ , QuickCheck >=2.11.3 && <2.14 - if !impl(ghc >= 8.0)- build-depends: semigroups >=0.18.4 && <0.19+ if !impl(ghc >=8.0)+ build-depends: semigroups >=0.18.5 && <0.19 - if impl(ghc < 7.5)- build-depends: ghc-prim+ if flag(cereal)+ build-depends: cereal >=0.5.5.0 && <0.6 + if flag(serialise)+ build-depends: serialise >=0.2.1.0 && <0.3++ if flag(http-api-data)+ build-depends: http-api-data ==0.4.*+ exposed-modules:- Data.ByteString.Base64.Type- Data.ByteString.Base64.Lazy.Type- Data.ByteString.Base64.URL.Type- Data.ByteString.Base64.URL.Lazy.Type+ Data.ByteString.Base64.Lazy.Type+ Data.ByteString.Base64.Type+ Data.ByteString.Base64.URL.Lazy.Type+ Data.ByteString.Base64.URL.Type+ default-language: Haskell2010 test-suite tests default-language: Haskell2010- type: exitcode-stdio-1.0- main-is: Tests.hs- hs-source-dirs:- test- ghc-options: -Wall+ type: exitcode-stdio-1.0+ main-is: Tests.hs+ hs-source-dirs: test+ ghc-options: -Wall -- dependencies with bounds inherited from library: build-depends:- base- , aeson+ aeson+ , base+ , base64-bytestring-type , binary , bytestring- , base64-bytestring-type- , cereal + if flag(cereal)+ build-depends: cereal++ if flag(serialise)+ build-depends: serialise++ if flag(http-api-data)+ build-depends: http-api-data+ -- other dependencies build-depends:- tasty >=0.10.0.2 && <1.1- , tasty-quickcheck >=0.8.3.2 && <0.10+ tasty >=1.2.1 && <1.3+ , tasty-quickcheck >=0.10 && <0.11
src/Data/ByteString/Base64/Lazy/Type.hs view
@@ -25,7 +25,6 @@ import Data.Data (Data, Typeable) import Data.Hashable (Hashable) import Data.Semigroup (Semigroup (..))-import Data.Serialize (Serialize) import Data.String (IsString (..)) import Data.Text.Lazy (fromStrict, toStrict) import Data.Text.Lazy.Encoding (decodeLatin1, encodeUtf8)@@ -36,10 +35,14 @@ import qualified Data.ByteString.Base64.Lazy as Base64 -#if !(MIN_VERSION_bytestring(0,10,0))-import Data.ByteString.Lazy.Internal (ByteString (..))+#ifdef MIN_VERSION_cereal+import Data.Serialize (Serialize) #endif +#ifdef MIN_VERSION_serialise+import Codec.Serialise (Serialise (..))+#endif+ -- | Aeson serialisable bytestring. Uses base64 encoding. -- -- The inner 'ByteString' is in raw format.@@ -144,19 +147,39 @@ -- cereal ------------------------------------------------------------------------------- +#ifdef MIN_VERSION_cereal -- | 'ByteString64' is serialised as 'ByteString'+--+-- >>> Cereal.encode (mkBS64 "foobar")+-- "\NUL\NUL\NUL\NUL\NUL\NUL\NUL\ACKfoobar" instance Serialize ByteString64+#endif ------------------------------------------------------------------------------- -- binary ------------------------------------------------------------------------------- -- | 'ByteString64' is serialised as 'ByteString'+--+-- >>> Binary.encode (mkBS64 "foobar")+-- "\NUL\NUL\NUL\NUL\NUL\NUL\NUL\ACKfoobar" instance Binary ByteString64 where put = put . getBS64 get = fmap makeByteString64 get -------------------------------------------------------------------------------+-- serialise+-------------------------------------------------------------------------------++#ifdef MIN_VERSION_serialise+-- | >>> Serialise.serialise (mkBS64 "xyzzy")+-- "_Exyzzy\255"+instance Serialise ByteString64 where+ encode = encode . getBS64+ decode = fmap makeByteString64 decode+#endif++------------------------------------------------------------------------------- -- QuickCheck ------------------------------------------------------------------------------- @@ -172,5 +195,7 @@ -- $setup -- >>> :set -XOverloadedStrings+-- >>> import qualified Codec.Serialise as Serialise+-- >>> import qualified Data.Serialize as Cereal -- >>> import qualified Data.Binary as Binary -- >>> import qualified Data.Aeson as Aeson
src/Data/ByteString/Base64/Type.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} -- | Strict 'ByteString' standard base64 encoding.@@ -24,7 +25,6 @@ import Data.Data (Data, Typeable) import Data.Hashable (Hashable) import Data.Semigroup (Semigroup (..))-import Data.Serialize (Serialize) import Data.String (IsString (..)) import Data.Text.Encoding (decodeLatin1, encodeUtf8) import GHC.Generics (Generic)@@ -33,7 +33,20 @@ shrinkMap) import qualified Data.ByteString.Base64 as Base64+import qualified Data.Text as T +#ifdef MIN_VERSION_cereal+import Data.Serialize (Serialize)+#endif++#ifdef MIN_VERSION_serialise+import Codec.Serialise (Serialise (..))+#endif++#ifdef MIN_VERSION_http_api_data+import Web.HttpApiData (FromHttpApiData (..), ToHttpApiData (..))+#endif+ -- | Aeson serialisable bytestring. Uses base64 encoding. -- -- The inner 'ByteString' is in raw format.@@ -133,19 +146,58 @@ -- cereal ------------------------------------------------------------------------------- +#ifdef MIN_VERSION_cereal -- | 'ByteString64' is serialised as 'ByteString'+--+-- >>> Cereal.encode (mkBS64 "foobar")+-- "\NUL\NUL\NUL\NUL\NUL\NUL\NUL\ACKfoobar" instance Serialize ByteString64+#endif ------------------------------------------------------------------------------- -- binary ------------------------------------------------------------------------------- -- | 'ByteString64' is serialised as 'ByteString'+--+-- >>> Binary.encode (mkBS64 "foobar")+-- "\NUL\NUL\NUL\NUL\NUL\NUL\NUL\ACKfoobar" instance Binary ByteString64 where put = put . getBS64 get = fmap makeByteString64 get -------------------------------------------------------------------------------+-- serialise+-------------------------------------------------------------------------------++#ifdef MIN_VERSION_serialise+-- | >>> Serialise.serialise (mkBS64 "xyzzy")+-- "Exyzzy"+instance Serialise ByteString64 where+ encode = encode . getBS64+ decode = fmap makeByteString64 decode+#endif++-------------------------------------------------------------------------------+-- http-api-data+-------------------------------------------------------------------------------++#ifdef MIN_VERSION_http_api_data+-- | >>> HTTP.toUrlPiece (mkBS64 $ pack [164..192])+-- "pKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8A="+--+-- /Note:/ the plus in the encoding.+-- Consider using "Data.ByteString.Base64.URL.Type" variant.+instance ToHttpApiData ByteString64 where+ toUrlPiece = decodeLatin1 . getEncodedByteString64+ toHeader = getEncodedByteString64++instance FromHttpApiData ByteString64 where+ parseUrlPiece = either (Left .T.pack) (Right . mkBS64) . Base64.decode . encodeUtf8+ parseHeader = either (Left . T.pack) (Right . mkBS64) . Base64.decode+#endif++------------------------------------------------------------------------------- -- QuickCheck ------------------------------------------------------------------------------- @@ -161,5 +213,8 @@ -- $setup -- >>> :set -XOverloadedStrings+-- >>> import qualified Codec.Serialise as Serialise+-- >>> import qualified Data.Serialize as Cereal -- >>> import qualified Data.Binary as Binary -- >>> import qualified Data.Aeson as Aeson+-- >>> import qualified Web.HttpApiData as HTTP
src/Data/ByteString/Base64/URL/Lazy/Type.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} -- | Lazy 'ByteString' base64 encoding with URL and filename safe alphabet.@@ -25,10 +25,9 @@ import Data.Data (Data, Typeable) import Data.Hashable (Hashable) import Data.Semigroup (Semigroup (..))-import Data.Serialize (Serialize) import Data.String (IsString (..)) import Data.Text.Lazy (fromStrict, toStrict)-import Data.Text.Lazy.Encoding (decodeLatin1, encodeUtf8, )+import Data.Text.Lazy.Encoding (decodeLatin1, encodeUtf8) import GHC.Generics (Generic) import Test.QuickCheck (Arbitrary (..), CoArbitrary (..), Function (..), functionMap,@@ -36,10 +35,14 @@ import qualified Data.ByteString.Base64.URL.Lazy as Base64 -#if !(MIN_VERSION_bytestring(0,10,0))-import Data.ByteString.Lazy.Internal (ByteString (..))+#ifdef MIN_VERSION_cereal+import Data.Serialize (Serialize) #endif +#ifdef MIN_VERSION_serialise+import Codec.Serialise (Serialise (..))+#endif+ -- | Aeson serialisable bytestring. Uses base64 encoding. -- -- The inner 'ByteString' is in raw format.@@ -144,19 +147,39 @@ -- cereal ------------------------------------------------------------------------------- +#ifdef MIN_VERSION_cereal -- | 'ByteString64' is serialised as 'ByteString'+--+-- >>> Cereal.encode (mkBS64 "foobar")+-- "\NUL\NUL\NUL\NUL\NUL\NUL\NUL\ACKfoobar" instance Serialize ByteString64+#endif ------------------------------------------------------------------------------- -- binary ------------------------------------------------------------------------------- -- | 'ByteString64' is serialised as 'ByteString'+--+-- >>> Binary.encode (mkBS64 "foobar")+-- "\NUL\NUL\NUL\NUL\NUL\NUL\NUL\ACKfoobar" instance Binary ByteString64 where put = put . getBS64 get = fmap makeByteString64 get -------------------------------------------------------------------------------+-- serialise+-------------------------------------------------------------------------------++#ifdef MIN_VERSION_serialise+-- | >>> Serialise.serialise (mkBS64 "xyzzy")+-- "_Exyzzy\255"+instance Serialise ByteString64 where+ encode = encode . getBS64+ decode = fmap makeByteString64 decode+#endif++------------------------------------------------------------------------------- -- QuickCheck ------------------------------------------------------------------------------- @@ -172,5 +195,7 @@ -- $setup -- >>> :set -XOverloadedStrings+-- >>> import qualified Codec.Serialise as Serialise+-- >>> import qualified Data.Serialize as Cereal -- >>> import qualified Data.Binary as Binary -- >>> import qualified Data.Aeson as Aeson
src/Data/ByteString/Base64/URL/Type.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} -- | Strict 'ByteString' base64 encoding with URL and filename safe alphabet.@@ -24,7 +25,6 @@ import Data.Data (Data, Typeable) import Data.Hashable (Hashable) import Data.Semigroup (Semigroup (..))-import Data.Serialize (Serialize) import Data.String (IsString (..)) import Data.Text.Encoding (decodeLatin1, encodeUtf8) import GHC.Generics (Generic)@@ -33,7 +33,20 @@ shrinkMap) import qualified Data.ByteString.Base64.URL as Base64+import qualified Data.Text as T +#ifdef MIN_VERSION_cereal+import Data.Serialize (Serialize)+#endif++#ifdef MIN_VERSION_serialise+import Codec.Serialise (Serialise (..))+#endif++#ifdef MIN_VERSION_http_api_data+import Web.HttpApiData (FromHttpApiData (..), ToHttpApiData (..))+#endif+ -- | Aeson serialisable bytestring. Uses base64 encoding. -- -- The inner 'ByteString' is in raw format.@@ -130,19 +143,55 @@ -- cereal ------------------------------------------------------------------------------- +#ifdef MIN_VERSION_cereal -- | 'ByteString64' is serialised as 'ByteString'+--+-- >>> Cereal.encode (mkBS64 "foobar")+-- "\NUL\NUL\NUL\NUL\NUL\NUL\NUL\ACKfoobar" instance Serialize ByteString64+#endif ------------------------------------------------------------------------------- -- binary ------------------------------------------------------------------------------- -- | 'ByteString64' is serialised as 'ByteString'+--+-- >>> Binary.encode (mkBS64 "foobar")+-- "\NUL\NUL\NUL\NUL\NUL\NUL\NUL\ACKfoobar" instance Binary ByteString64 where put = put . getBS64 get = fmap makeByteString64 get -------------------------------------------------------------------------------+-- serialise+-------------------------------------------------------------------------------++#ifdef MIN_VERSION_serialise+-- | >>> Serialise.serialise (mkBS64 "xyzzy")+-- "Exyzzy"+instance Serialise ByteString64 where+ encode = encode . getBS64+ decode = fmap makeByteString64 decode+#endif++-------------------------------------------------------------------------------+-- http-api-data+-------------------------------------------------------------------------------++#ifdef MIN_VERSION_http_api_data+-- | >>> HTTP.toUrlPiece (mkBS64 $ pack [164..192])+-- "pKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2-v8A="+instance ToHttpApiData ByteString64 where+ toUrlPiece = decodeLatin1 . getEncodedByteString64+ toHeader = getEncodedByteString64++instance FromHttpApiData ByteString64 where+ parseUrlPiece = either (Left .T.pack) (Right . mkBS64) . Base64.decode . encodeUtf8+ parseHeader = either (Left . T.pack) (Right . mkBS64) . Base64.decode+#endif++------------------------------------------------------------------------------- -- QuickCheck ------------------------------------------------------------------------------- @@ -158,5 +207,8 @@ -- $setup -- >>> :set -XOverloadedStrings+-- >>> import qualified Codec.Serialise as Serialise+-- >>> import qualified Data.Serialize as Cereal -- >>> import qualified Data.Binary as Binary -- >>> import qualified Data.Aeson as Aeson+-- >>> import qualified Web.HttpApiData as HTTP
test/Tests.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} module Main (main) where import Test.Tasty@@ -11,8 +12,19 @@ import qualified Data.ByteString.Base64.URL.Lazy.Type as UL import qualified Data.ByteString.Base64.URL.Type as US import qualified Data.ByteString.Lazy as LBS-import qualified Data.Serialize as C +#ifdef MIN_VERSION_cereal+import qualified Data.Serialize as C+#endif++#ifdef MIN_VERSION_serialise+import qualified Codec.Serialise as CBOR+#endif++#ifdef MIN_VERSION_http_api_data+import qualified Web.HttpApiData as HTTP+#endif+ main :: IO () main = defaultMain tests @@ -20,11 +32,19 @@ tests = testGroup "Tests" [ aeson , binary+#ifdef MIN_VERSION_cereal , cereal+#endif+#ifdef MIN_VERSION_serialise+ , serialise+#endif+#ifdef MIN_VERSION_http_api_data+ , httpApiData+#endif ] aeson :: TestTree-aeson = testGroup "Aeson"+aeson = testGroup "aeson" [ testProperty "strict" propS , testProperty "lazy" propL , testProperty "strict url" propUL@@ -37,7 +57,7 @@ propUS bs64 = A.decode (A.encode bs64) === Just (bs64 :: US.ByteString64) binary :: TestTree-binary = testGroup "Binary"+binary = testGroup "binary" [ testProperty "strict" propS , testProperty "lazy" propL , testProperty "strict url" propUL@@ -56,8 +76,9 @@ propUL ws = let bs64 = UL.makeByteString64 (LBS.pack ws) in B.decode (B.encode bs64) === bs64 +#ifdef MIN_VERSION_cereal cereal :: TestTree-cereal = testGroup "Cereal"+cereal = testGroup "cereal" [ testProperty "strict" propS , testProperty "lazy" propL , testProperty "strict url" propUL@@ -75,3 +96,56 @@ propUL ws = let bs64 = UL.makeByteString64 (LBS.pack ws) in C.decode (C.encode bs64) === Right bs64+#endif++#ifdef MIN_VERSION_serialise+serialise :: TestTree+serialise = testGroup "serialise"+ [ testProperty "strict" propS+ , testProperty "lazy" propL+ , testProperty "strict url" propUL+ , testProperty "lazy url" propUS+ ]+ where+ propS ws = let bs64 = S.makeByteString64 (BS.pack ws)+ in CBOR.deserialiseOrFail (CBOR.serialise bs64) === Right bs64++ propL ws = let bs64 = L.makeByteString64 (LBS.pack ws)+ in CBOR.deserialiseOrFail (CBOR.serialise bs64) === Right bs64++ propUS ws = let bs64 = US.makeByteString64 (BS.pack ws)+ in CBOR.deserialiseOrFail (CBOR.serialise bs64) === Right bs64++ propUL ws = let bs64 = UL.makeByteString64 (LBS.pack ws)+ in CBOR.deserialiseOrFail (CBOR.serialise bs64) === Right bs64+#endif++#ifdef MIN_VERSION_http_api_data+httpApiData :: TestTree+httpApiData = testGroup "http-api-data"+ [ testProperty "toUrlPiece" propU+ , testProperty "toUrlPiece url" propUU+ , testProperty "toHeader" propH+ , testProperty "toHeader url" propHU+ , testProperty "toQueryParam" propQ+ , testProperty "toQueryParam url" propQU+ ]+ where+ propU ws = let bs64 = S.makeByteString64 (BS.pack ws)+ in HTTP.parseUrlPiece (HTTP.toUrlPiece bs64) === Right bs64++ propUU ws = let bs64 = US.makeByteString64 (BS.pack ws)+ in HTTP.parseUrlPiece (HTTP.toUrlPiece bs64) === Right bs64++ propH ws = let bs64 = S.makeByteString64 (BS.pack ws)+ in HTTP.parseHeader (HTTP.toHeader bs64) === Right bs64++ propHU ws = let bs64 = US.makeByteString64 (BS.pack ws)+ in HTTP.parseHeader (HTTP.toHeader bs64) === Right bs64++ propQ ws = let bs64 = S.makeByteString64 (BS.pack ws)+ in HTTP.parseQueryParam (HTTP.toQueryParam bs64) === Right bs64++ propQU ws = let bs64 = US.makeByteString64 (BS.pack ws)+ in HTTP.parseQueryParam (HTTP.toQueryParam bs64) === Right bs64+#endif