utf8-conversions (empty) → 0.1.0.0
raw patch · 7 files changed
+503/−0 lines, 7 filesdep +basedep +bytestringdep +textsetup-changed
Dependencies added: base, bytestring, text, text-short, utf8-conversions, utf8-string
Files
- ChangeLog.md +5/−0
- LICENSE +30/−0
- README.md +37/−0
- Setup.hs +2/−0
- src/Data/Convertible/Utf8.hs +367/−0
- test/Spec.hs +2/−0
- utf8-conversions.cabal +60/−0
+ ChangeLog.md view
@@ -0,0 +1,5 @@+# Changelog for utf8-conversions++#### 0.1.0.0.++init package
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright Shintaro Sakata (c) 2020++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Author name here nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ README.md view
@@ -0,0 +1,37 @@+# `utf8-conversions` safe and easy++This package provides a Data.Convertible.Utf8 library for easy conversion of many string types in Haskell++## Support++- String+- ByteString+- ByteStringBuilder+- LazyByteString+- ByteStringShort+- Text+- LazyText+- TextBuilder+- TextShort++Supports type conversion between the above types.+Byte string is assumed to be in utf-8 encoding.++## Why?++String conversion in haskell is more difficult than in other languages and needs to be easier.++In particular, the OverloadedStrings pragma does not work properly when creating a ByteString.++So why not other conversion libraries?+There are many other conversion libraries that use the Maybe type for safety or are not explicitly stated as utf8.++Libraries that use maybe types are very labor intensive.+Libraries that do not explicitly state UTF8 are insecure++Therefore, this library clearly states that it assumes UTF8 and performs the conversion without using the MAYBE type, which is both safe and easy.+。++## Get involved!++If there's a bug or a better way to convert, please report it!
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ src/Data/Convertible/Utf8.hs view
@@ -0,0 +1,367 @@+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++module Data.Convertible.Utf8 where++import qualified Data.ByteString as BS+import qualified Data.ByteString.Builder as BSB+import qualified Data.ByteString.Lazy as BSL+import qualified Data.ByteString.Lazy.UTF8 as BSL.UTF8+import qualified Data.ByteString.Short as BSS+import qualified Data.ByteString.UTF8 as BS.UTF8+import Data.Maybe (fromJust)+import qualified Data.Text as T+import qualified Data.Text.Encoding as TE+import qualified Data.Text.Lazy as TL+import qualified Data.Text.Lazy.Builder as TB+import qualified Data.Text.Lazy.Encoding as TLE+import qualified Data.Text.Short as TS++-- | A typeclass that represents something that can be converted.+-- A @Convertible a b@ instance represents an @a@ that can be converted to a @b@.+class Convertible a b where+ -- | Convert from @a@ to @b@.+ -- Byte string is assumed to be in utf-8 encoding.+ convert :: a -> b++-- Convert from String++instance Convertible String String where+ {-# INLINE convert #-}+ convert = id++instance Convertible String T.Text where+ {-# INLINE convert #-}+ convert = T.pack++instance Convertible String TL.Text where+ {-# INLINE convert #-}+ convert = TL.pack++instance Convertible String TB.Builder where+ {-# INLINE convert #-}+ convert = TB.fromString++instance Convertible String TS.ShortText where+ {-# INLINE convert #-}+ convert = TS.fromString++instance Convertible String BS.ByteString where+ {-# INLINE convert #-}+ convert = BS.UTF8.fromString++instance Convertible String BSL.ByteString where+ {-# INLINE convert #-}+ convert = BSL.UTF8.fromString++instance Convertible String BSB.Builder where+ {-# INLINE convert #-}+ convert = BSB.stringUtf8++instance Convertible String BSS.ShortByteString where+ {-# INLINE convert #-}+ convert = BSS.toShort . BS.UTF8.fromString++-- Convert from Text++instance Convertible T.Text String where+ {-# INLINE convert #-}+ convert = T.unpack++instance Convertible T.Text T.Text where+ {-# INLINE convert #-}+ convert = id++instance Convertible T.Text TL.Text where+ {-# INLINE convert #-}+ convert = TL.fromStrict++instance Convertible T.Text TB.Builder where+ {-# INLINE convert #-}+ convert = TB.fromText++instance Convertible T.Text TS.ShortText where+ {-# INLINE convert #-}+ convert = TS.fromText++instance Convertible T.Text BS.ByteString where+ {-# INLINE convert #-}+ convert = TE.encodeUtf8++instance Convertible T.Text BSL.ByteString where+ {-# INLINE convert #-}+ convert = BSL.fromStrict . TE.encodeUtf8++instance Convertible T.Text BSB.Builder where+ {-# INLINE convert #-}+ convert = TE.encodeUtf8Builder++instance Convertible T.Text BSS.ShortByteString where+ {-# INLINE convert #-}+ convert = BSS.toShort . TE.encodeUtf8++-- Convert from LazyText++instance Convertible TL.Text String where+ {-# INLINE convert #-}+ convert = TL.unpack++instance Convertible TL.Text T.Text where+ {-# INLINE convert #-}+ convert = TL.toStrict++instance Convertible TL.Text TL.Text where+ {-# INLINE convert #-}+ convert = id++instance Convertible TL.Text TS.ShortText where+ {-# INLINE convert #-}+ convert = TS.fromText . TL.toStrict++instance Convertible TL.Text TB.Builder where+ {-# INLINE convert #-}+ convert = TB.fromLazyText++instance Convertible TL.Text BS.ByteString where+ {-# INLINE convert #-}+ convert = BSL.toStrict . TLE.encodeUtf8++instance Convertible TL.Text BSL.ByteString where+ {-# INLINE convert #-}+ convert = TLE.encodeUtf8++instance Convertible TL.Text BSB.Builder where+ {-# INLINE convert #-}+ convert = TLE.encodeUtf8Builder++instance Convertible TL.Text BSS.ShortByteString where+ {-# INLINE convert #-}+ convert = BSS.toShort . BSL.toStrict . TLE.encodeUtf8++-- Convert from ShortText++instance Convertible TS.ShortText String where+ {-# INLINE convert #-}+ convert = TS.toString++instance Convertible TS.ShortText T.Text where+ {-# INLINE convert #-}+ convert = TS.toText++instance Convertible TS.ShortText TL.Text where+ {-# INLINE convert #-}+ convert = TL.fromStrict . TS.toText++instance Convertible TS.ShortText TS.ShortText where+ {-# INLINE convert #-}+ convert = id++instance Convertible TS.ShortText TB.Builder where+ {-# INLINE convert #-}+ convert = TB.fromText . TS.toText++instance Convertible TS.ShortText BS.ByteString where+ {-# INLINE convert #-}+ convert = TS.toByteString++instance Convertible TS.ShortText BSL.ByteString where+ {-# INLINE convert #-}+ convert = BSB.toLazyByteString . TS.toBuilder++instance Convertible TS.ShortText BSB.Builder where+ {-# INLINE convert #-}+ convert = TS.toBuilder++instance Convertible TS.ShortText BSS.ShortByteString where+ {-# INLINE convert #-}+ convert = TS.toShortByteString++-- Convert from TextBuilder++instance Convertible TB.Builder String where+ {-# INLINE convert #-}+ convert = TL.unpack . TB.toLazyText++instance Convertible TB.Builder T.Text where+ {-# INLINE convert #-}+ convert = TL.toStrict . TB.toLazyText++instance Convertible TB.Builder TL.Text where+ {-# INLINE convert #-}+ convert = TB.toLazyText++instance Convertible TB.Builder TS.ShortText where+ {-# INLINE convert #-}+ convert = TS.fromText . TL.toStrict . TB.toLazyText++instance Convertible TB.Builder TB.Builder where+ {-# INLINE convert #-}+ convert = id++instance Convertible TB.Builder BS.ByteString where+ {-# INLINE convert #-}+ convert = BSL.toStrict . TLE.encodeUtf8 . TB.toLazyText++instance Convertible TB.Builder BSL.ByteString where+ {-# INLINE convert #-}+ convert = TLE.encodeUtf8 . TB.toLazyText++instance Convertible TB.Builder BSB.Builder where+ {-# INLINE convert #-}+ convert = TLE.encodeUtf8Builder . TB.toLazyText++instance Convertible TB.Builder BSS.ShortByteString where+ {-# INLINE convert #-}+ convert = BSS.toShort . BSL.toStrict . TLE.encodeUtf8 . TB.toLazyText++-- Convert from ByteString++instance Convertible BS.ByteString String where+ {-# INLINE convert #-}+ convert = BS.UTF8.toString++instance Convertible BS.ByteString T.Text where+ {-# INLINE convert #-}+ convert = TE.decodeUtf8++instance Convertible BS.ByteString TL.Text where+ {-# INLINE convert #-}+ convert = TLE.decodeUtf8 . BSL.fromStrict++instance Convertible BS.ByteString TS.ShortText where+ {-# INLINE convert #-}+ convert = fromJust . TS.fromByteString++instance Convertible BS.ByteString TB.Builder where+ {-# INLINE convert #-}+ convert = TB.fromLazyText . TL.fromStrict . TE.decodeUtf8++instance Convertible BS.ByteString BS.ByteString where+ {-# INLINE convert #-}+ convert = id++instance Convertible BS.ByteString BSL.ByteString where+ {-# INLINE convert #-}+ convert = BSL.fromStrict++instance Convertible BS.ByteString BSB.Builder where+ {-# INLINE convert #-}+ convert = BSB.byteString++instance Convertible BS.ByteString BSS.ShortByteString where+ {-# INLINE convert #-}+ convert = BSS.toShort++-- Convert from LazyByteString++instance Convertible BSL.ByteString String where+ {-# INLINE convert #-}+ convert = BSL.UTF8.toString++instance Convertible BSL.ByteString T.Text where+ {-# INLINE convert #-}+ convert = TE.decodeUtf8 . BSL.toStrict++instance Convertible BSL.ByteString TL.Text where+ {-# INLINE convert #-}+ convert = TLE.decodeUtf8++instance Convertible BSL.ByteString TS.ShortText where+ {-# INLINE convert #-}+ convert = fromJust . TS.fromByteString . BSL.toStrict++instance Convertible BSL.ByteString TB.Builder where+ {-# INLINE convert #-}+ convert = TB.fromLazyText . TLE.decodeUtf8++instance Convertible BSL.ByteString BS.ByteString where+ {-# INLINE convert #-}+ convert = BSL.toStrict++instance Convertible BSL.ByteString BSL.ByteString where+ {-# INLINE convert #-}+ convert = id++instance Convertible BSL.ByteString BSB.Builder where+ {-# INLINE convert #-}+ convert = BSB.lazyByteString++instance Convertible BSL.ByteString BSS.ShortByteString where+ {-# INLINE convert #-}+ convert = BSS.toShort . BSL.toStrict++-- Convert from ByteStringBuilder++instance Convertible BSB.Builder String where+ {-# INLINE convert #-}+ convert = BSL.UTF8.toString . BSB.toLazyByteString++instance Convertible BSB.Builder T.Text where+ {-# INLINE convert #-}+ convert = TE.decodeUtf8 . BSL.toStrict . BSB.toLazyByteString++instance Convertible BSB.Builder TL.Text where+ {-# INLINE convert #-}+ convert = TLE.decodeUtf8 . BSB.toLazyByteString++instance Convertible BSB.Builder TS.ShortText where+ {-# INLINE convert #-}+ convert = fromJust . TS.fromShortByteString . BSS.toShort . BSL.toStrict . BSB.toLazyByteString++instance Convertible BSB.Builder TB.Builder where+ {-# INLINE convert #-}+ convert = TB.fromLazyText . TLE.decodeUtf8 . BSB.toLazyByteString++instance Convertible BSB.Builder BS.ByteString where+ {-# INLINE convert #-}+ convert = BSL.toStrict . BSB.toLazyByteString++instance Convertible BSB.Builder BSL.ByteString where+ {-# INLINE convert #-}+ convert = BSB.toLazyByteString++instance Convertible BSB.Builder BSB.Builder where+ {-# INLINE convert #-}+ convert = id++instance Convertible BSB.Builder BSS.ShortByteString where+ {-# INLINE convert #-}+ convert = BSS.toShort . BSL.toStrict . BSB.toLazyByteString++-- Convert from ShortByteString++instance Convertible BSS.ShortByteString String where+ {-# INLINE convert #-}+ convert = BS.UTF8.toString . BSS.fromShort++instance Convertible BSS.ShortByteString T.Text where+ {-# INLINE convert #-}+ convert = TE.decodeUtf8 . BSS.fromShort++instance Convertible BSS.ShortByteString TL.Text where+ {-# INLINE convert #-}+ convert = TLE.decodeUtf8 . BSL.fromStrict . BSS.fromShort++instance Convertible BSS.ShortByteString TS.ShortText where+ {-# INLINE convert #-}+ convert = fromJust . TS.fromShortByteString++instance Convertible BSS.ShortByteString TB.Builder where+ {-# INLINE convert #-}+ convert = TB.fromText . TE.decodeUtf8 . BSS.fromShort++instance Convertible BSS.ShortByteString BS.ByteString where+ {-# INLINE convert #-}+ convert = BSS.fromShort++instance Convertible BSS.ShortByteString BSL.ByteString where+ {-# INLINE convert #-}+ convert = BSL.fromStrict . BSS.fromShort++instance Convertible BSS.ShortByteString BSB.Builder where+ {-# INLINE convert #-}+ convert = BSB.byteString . BSS.fromShort++instance Convertible BSS.ShortByteString BSS.ShortByteString where+ {-# INLINE convert #-}+ convert = id
+ test/Spec.hs view
@@ -0,0 +1,2 @@+main :: IO ()+main = putStrLn "Test suite not yet implemented"
+ utf8-conversions.cabal view
@@ -0,0 +1,60 @@+cabal-version: 1.12++-- This file has been generated from package.yaml by hpack version 0.33.0.+--+-- see: https://github.com/sol/hpack+--+-- hash: c2d1679544a41e4847b7ff39dd859cf11cd5f2f6dd8ad00b4f09417a70240524++name: utf8-conversions+version: 0.1.0.0+synopsis: A conversion library that assumes utf8+description: Please see the README on GitHub at <https://github.com/chemirea/utf8-conversions#readme>+category: Data, Codec+homepage: https://github.com/chemirea/utf8-conversions#readme+bug-reports: https://github.com/chemirea/utf8-conversions/issues+author: Shintaro Sakata+maintainer: Shintaro Sakata+copyright: 2020 Shintaro Sakata+license: BSD3+license-file: LICENSE+build-type: Simple+extra-source-files:+ README.md+ ChangeLog.md++source-repository head+ type: git+ location: https://github.com/chemirea/utf8-conversions++library+ exposed-modules:+ Data.Convertible.Utf8+ other-modules:+ Paths_utf8_conversions+ hs-source-dirs:+ src+ build-depends:+ base >=4.7 && <5+ , bytestring >=0.10.4 && <0.11+ , text >=1.0 && <1.3+ , text-short >=0.1.2 && <0.1.4+ , utf8-string >=1.0 && <1.2+ default-language: Haskell2010++test-suite utf8-conversions-test+ type: exitcode-stdio-1.0+ main-is: Spec.hs+ other-modules:+ Paths_utf8_conversions+ hs-source-dirs:+ test+ ghc-options: -threaded -rtsopts -with-rtsopts=-N+ build-depends:+ base >=4.7 && <5+ , bytestring >=0.10.4 && <0.11+ , text >=1.0 && <1.3+ , text-short >=0.1.2 && <0.1.4+ , utf8-conversions+ , utf8-string >=1.0 && <1.2+ default-language: Haskell2010