unwitch 3.0.0 → 3.1.0
raw patch · 4 files changed
+119/−1 lines, 4 filesdep +os-string
Dependencies added: os-string
Files
- Changelog.md +16/−0
- src/Unwitch/Convert/Text.hs +54/−0
- test/Test/Convert/TextSpec.hs +47/−0
- unwitch.cabal +2/−1
Changelog.md view
@@ -1,5 +1,21 @@ # Change log for unwitch project +## Version 3.1.0++### Added++ New Text conversions ported from the from-text library, using explicit+ named functions instead of typeclasses:+ - toLazyByteStringUtf8 — encode Text as UTF-8 lazy ByteString+ - toByteStringBuilderUtf8 — encode Text as UTF-8 ByteString Builder+ - toTextBuilder — convert Text to lazy Text Builder+ - toShortByteStringUtf8 — encode Text as UTF-8 ShortByteString+ - toPosixString — encode Text as UTF-8 PosixString (GHC only)+ - toWindowsString — encode Text as UTF-16 LE WindowsString (GHC only)+ - toOsString — encode Text to platform-native OsString (GHC only)++ New dependency: os-string (for OsString/PosixString/WindowsString support)++ All new conversions are guarded behind __GLASGOW_HASKELL__ for MicroHs+ compatibility+ ## Version 3.0.0 ### Breaking changes (GHC only)
src/Unwitch/Convert/Text.hs view
@@ -9,6 +9,15 @@ , toByteStringUtf32LE , toByteStringUtf32BE , toByteStringLatin1+#ifdef __GLASGOW_HASKELL__+ , toLazyByteStringUtf8+ , toByteStringBuilderUtf8+ , toTextBuilder+ , toShortByteStringUtf8+ , toPosixString+ , toWindowsString+ , toOsString+#endif ) where @@ -19,6 +28,18 @@ import Data.Text.Encoding qualified as TE import Data.Text.Lazy qualified as LT +#ifdef __GLASGOW_HASKELL__+import Data.ByteString.Lazy qualified as LBS+import Data.ByteString.Builder qualified as BB+import Data.ByteString.Short qualified as SBS+import Data.ByteString.Short (ShortByteString)+import Data.Coerce (coerce)+import Data.Text.Lazy.Builder qualified as TLB+import System.OsString qualified as OS+import System.OsString.Internal.Types qualified as OSIT+import System.OsString.Posix qualified as OSP+#endif+ toLazyText :: Text -> LT.Text #ifdef __GLASGOW_HASKELL__ toLazyText = LT.fromStrict@@ -56,3 +77,36 @@ isLatin1 :: Char -> Bool isLatin1 c = c <= '\xFF'++#ifdef __GLASGOW_HASKELL__+-- | Encode as UTF-8 lazy 'LBS.ByteString'.+toLazyByteStringUtf8 :: Text -> LBS.ByteString+toLazyByteStringUtf8 = LBS.fromStrict . TE.encodeUtf8++-- | Encode as UTF-8 'BB.Builder'.+toByteStringBuilderUtf8 :: Text -> BB.Builder+toByteStringBuilderUtf8 = TE.encodeUtf8Builder++-- | Convert to a lazy 'TLB.Builder'.+toTextBuilder :: Text -> TLB.Builder+toTextBuilder = TLB.fromText++-- | Encode as UTF-8 'ShortByteString'.+toShortByteStringUtf8 :: Text -> ShortByteString+toShortByteStringUtf8 = SBS.toShort . TE.encodeUtf8++-- | Encode as UTF-8 'OSP.PosixString'.+toPosixString :: Text -> OSP.PosixString+toPosixString = coerce . SBS.toShort . TE.encodeUtf8++-- | Encode as UTF-16 LE 'OSIT.WindowsString'.+toWindowsString :: Text -> OSIT.WindowsString+toWindowsString = coerce . SBS.toShort . TE.encodeUtf16LE++-- | Encode to the platform's native 'OS.OsString'.+-- UTF-16 LE on Windows, UTF-8 on POSIX.+toOsString :: Text -> OS.OsString+toOsString = case OS.coercionToPlatformTypes of+ Left{} -> coerce . toWindowsString+ Right{} -> coerce . toPosixString+#endif
test/Test/Convert/TextSpec.hs view
@@ -6,6 +6,16 @@ import qualified Unwitch.Convert.LazyText as LazyText import qualified Unwitch.Convert.ByteString as ByteString +#ifdef __GLASGOW_HASKELL__+import Data.ByteString.Lazy qualified as LBS+import Data.ByteString.Builder qualified as BB+import Data.ByteString.Short qualified as SBS+import Data.Text.Lazy qualified as LT+import Data.Text.Lazy.Builder qualified as TLB+import qualified System.OsString as OS+import qualified System.OsString.Posix as OSP+#endif+ spec :: Spec spec = describe "Unwitch.Convert.Text" $ do @@ -66,3 +76,40 @@ it "fails for chars above 0xFF" $ let t = T.pack "\x0100" -- Latin Extended-A in Text.toByteStringLatin1 t `shouldBe` Nothing++#ifdef __GLASGOW_HASKELL__+ describe "toLazyByteStringUtf8" $ do+ it "encodes ASCII" $+ Text.toLazyByteStringUtf8 "hello" `shouldBe` "hello"+ it "produces same bytes as toByteStringUtf8" $+ let t = T.pack "caf\x00E9"+ in LBS.toStrict (Text.toLazyByteStringUtf8 t) `shouldBe` Text.toByteStringUtf8 t++ describe "toByteStringBuilderUtf8" $+ it "produces same bytes as toByteStringUtf8" $+ let t = T.pack "caf\x00E9 \x1F600"+ in LBS.toStrict (BB.toLazyByteString (Text.toByteStringBuilderUtf8 t))+ `shouldBe` Text.toByteStringUtf8 t++ describe "toTextBuilder" $+ it "produces same text as input" $+ let t = T.pack "hello \x00E9\x1F600"+ in LT.toStrict (TLB.toLazyText (Text.toTextBuilder t)) `shouldBe` t++ describe "toShortByteStringUtf8" $+ it "produces same bytes as toByteStringUtf8" $+ let t = T.pack "caf\x00E9 \x1F600"+ in SBS.fromShort (Text.toShortByteStringUtf8 t) `shouldBe` Text.toByteStringUtf8 t++ describe "toPosixString" $+ it "matches encodeUtf from os-string" $+ let t = T.pack "caf\x00E9"+ expected = OSP.unsafeEncodeUtf (T.unpack t)+ in Text.toPosixString t `shouldBe` expected++ describe "toOsString" $+ it "matches encodeUtf from os-string" $+ let t = T.pack "hello/world.txt"+ expected = OS.unsafeEncodeUtf (T.unpack t)+ in Text.toOsString t `shouldBe` expected+#endif
unwitch.cabal view
@@ -1,7 +1,7 @@ cabal-version: 3.0 name: unwitch-version: 3.0.0+version: 3.1.0 homepage: https://github.com/jappeace/unwitch#readme synopsis: converts between primitives description: @@ -80,6 +80,7 @@ build-depends: base >=4.18.0.0 && <4.23, bytestring >= 0.10 && < 0.13,+ os-string >= 2.0 && < 2.1, text >= 1.2 && < 2.2 default-language: Haskell2010