packages feed

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 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