packages feed

data-ascii (empty) → 1.0.0.0

raw patch · 7 files changed

+379/−0 lines, 7 filesdep +basedep +blaze-builderdep +bytestringsetup-changed

Dependencies added: base, blaze-builder, bytestring, case-insensitive, hashable, semigroups, text

Files

+ Data/Ascii.hs view
@@ -0,0 +1,61 @@+module Data.Ascii+    ( -- * Datatypes+      Ascii+    , CIAscii+    , AsciiBuilder+      -- * Construction+      -- ** Safe+    , fromByteString+    , fromChars+    , fromText+      -- ** Unsafe+    , unsafeFromByteString+    , unsafeFromString+    , unsafeFromText+      -- * Extraction+    , toByteString+    , toString+    , toText+      -- * Case insensitive+    , toCIAscii+    , fromCIAscii+    , ciToByteString+      -- * Builder+    , toAsciiBuilder+    , fromAsciiBuilder+    , unsafeFromBuilder+    , toBuilder+      -- * Character-level functions and predicates+    , fromChar+    , toChar+    , ascii+    , isAscii+    , isControl+    , isPrintable+    , isWhiteSpace+    , isSpaceOrTab+    , isLower+    , isUpper+    , toLower+    , toUpper+    , isAlpha+    , isDigit+    , isAlphaNum+    , fromDigit+    , unsafeFromDigit+    , fromOctDigit+    , unsafeFromOctDigit+    , isUpHexDigit+    , fromUpHexDigit+    , unsafeFromUpHexDigit+    , isLowHexDigit+    , fromLowHexDigit+    , unsafeFromLowHexDigit+    , isHexDigit+    , fromHexDigit+    , unsafeFromHexDigit+    ) where++import Data.Ascii.Blaze+import Data.Ascii.ByteString+import Data.Ascii.Word8
+ Data/Ascii/Blaze.hs view
@@ -0,0 +1,27 @@+{-# LANGUAGE GeneralizedNewtypeDeriving #-}++module Data.Ascii.Blaze where++import Data.Ascii.ByteString++-- base+import Data.Monoid (Monoid)+import Data.Semigroup (Semigroup)++-- blaze-builder+import qualified Blaze.ByteString.Builder as Blaze++newtype AsciiBuilder = AsciiBuilder (Blaze.Builder)+    deriving (Semigroup, Monoid)++unsafeFromBuilder :: Blaze.Builder -> AsciiBuilder+unsafeFromBuilder = AsciiBuilder++toBuilder :: AsciiBuilder -> Blaze.Builder+toBuilder (AsciiBuilder b) = b++toAsciiBuilder :: Ascii -> AsciiBuilder+toAsciiBuilder (Ascii bs) = AsciiBuilder $ Blaze.fromByteString bs++fromAsciiBuilder :: AsciiBuilder -> Ascii+fromAsciiBuilder (AsciiBuilder b) = Ascii $ Blaze.toByteString b
+ Data/Ascii/ByteString.hs view
@@ -0,0 +1,75 @@+{-# LANGUAGE DeriveDataTypeable, GeneralizedNewtypeDeriving #-}++module Data.Ascii.ByteString where++-- base+import Data.Data (Data)+import Data.Typeable (Typeable)+import Data.String (IsString (..))+import qualified Data.Char as C+import Data.Monoid (Monoid)+import Data.Semigroup (Semigroup)++-- bytestring+import qualified Data.ByteString as S+import qualified Data.ByteString.Char8 as S8+import Data.ByteString (ByteString)++-- case-insensitive+import Data.CaseInsensitive (FoldCase, CI, mk, original)++-- hashable+import Data.Hashable (Hashable)++-- text+import Data.Text (Text)+import qualified Data.Text as T+import qualified Data.Text.Encoding as TE++newtype Ascii = Ascii ByteString+    deriving (Show, Eq, Read, Ord, Data, Typeable, IsString, FoldCase, Hashable, Semigroup, Monoid)++type CIAscii = CI Ascii++fromByteString :: ByteString -> Maybe Ascii+fromByteString bs+    | S.all (< 128) bs = Just $ Ascii bs+    | otherwise = Nothing++-- | Renamed to avoid clash with 'fromString'+fromChars :: String -> Maybe Ascii+fromChars s+    | all C.isAscii s = Just $ Ascii $ S8.pack s+    | otherwise = Nothing++fromText :: Text -> Maybe Ascii+fromText t+    | T.all C.isAscii t = Just $ Ascii $ TE.encodeUtf8 t+    | otherwise = Nothing++unsafeFromByteString :: ByteString -> Ascii+unsafeFromByteString = Ascii++unsafeFromString :: String -> Ascii+unsafeFromString = Ascii . S8.pack++unsafeFromText :: Text -> Ascii+unsafeFromText = Ascii . TE.encodeUtf8++toCIAscii :: Ascii -> CIAscii+toCIAscii = mk++fromCIAscii :: CIAscii -> Ascii+fromCIAscii = original++toByteString :: Ascii -> ByteString+toByteString (Ascii bs) = bs++toString :: Ascii -> String+toString (Ascii bs) = S8.unpack bs++toText :: Ascii -> Text+toText (Ascii bs) = TE.decodeUtf8 bs++ciToByteString :: CIAscii -> ByteString+ciToByteString = toByteString . original
+ Data/Ascii/Word8.hs view
@@ -0,0 +1,148 @@+{-# LANGUAGE CPP #-}++module Data.Ascii.Word8 where++-- base+import Data.Word (Word8)+import qualified Data.Char as C++fromChar :: Char -> Maybe Word8+fromChar c = if i < 128 then Just (fromIntegral i) else Nothing+  where i = C.ord c++toChar :: Word8 -> Char+toChar = C.chr . fromIntegral++-- | Unsafe version of 'fromChar'+ascii :: Char -> Word8+ascii = fromIntegral . C.ord+{-# INLINE ascii #-}++isAscii :: Word8 -> Bool+isAscii = (< 128)++isControl :: Word8 -> Bool+isControl w = w < 32 || w == 127++isPrintable :: Word8 -> Bool+isPrintable w = w >= 32 && w < 127++isWhiteSpace :: Word8 -> Bool+isWhiteSpace w = w == ascii ' ' || w >= 9 && w <= 13++isSpaceOrTab :: Word8 -> Bool+isSpaceOrTab w = w == ascii ' ' || w == ascii '\t'++isLower :: Word8 -> Bool+isLower w = w >= ascii 'a' && w <= ascii 'z'++isUpper :: Word8 -> Bool+isUpper w = w >= ascii 'A' && w <= ascii 'Z'++toLower :: Word8 -> Word8+toLower w | isUpper w = w + 32+          | otherwise = w++toUpper :: Word8 -> Word8+toUpper w | isLower w = w - 32+          | otherwise = w++isAlpha :: Word8 -> Bool+isAlpha w = isUpper w || isLower w++isDigit :: Word8 -> Bool+isDigit w = w >= ascii '0' && w <= ascii '9'++isAlphaNum :: Word8 -> Bool+isAlphaNum w = isDigit w || isAlpha w++fromDigit :: Num a => Word8 -> Maybe a+fromDigit w | isDigit w = Just $ unsafeFromDigit w+            | otherwise = Nothing+#if __GLASGOW_HASKELL__ >= 700+{-# INLINABLE fromDigit #-}+#endif++unsafeFromDigit :: Num a => Word8 -> a+unsafeFromDigit w = fromIntegral (w - ascii '0')+{-# INLINE unsafeFromDigit #-}++isOctDigit :: Word8 -> Bool+isOctDigit w = w >= ascii '0' && w <= ascii '7'++fromOctDigit :: Num a => Word8 -> Maybe a+fromOctDigit w | isOctDigit w = Just $ unsafeFromOctDigit w+               | otherwise    = Nothing+#if __GLASGOW_HASKELL__ >= 700+{-# INLINABLE fromOctDigit #-}+#endif++unsafeFromOctDigit :: Num a => Word8 -> a+unsafeFromOctDigit = unsafeFromDigit+{-# INLINE unsafeFromOctDigit #-}++isLowAF :: Word8 -> Bool+isLowAF w = w >= ascii 'a' && w <= ascii 'f'+{-# INLINE isLowAF #-}++fromLowAF :: Num a => Word8 -> a+fromLowAF w = fromIntegral (w - ascii 'a' + 10)+{-# INLINE fromLowAF #-}++isLowHexDigit :: Word8 -> Bool+isLowHexDigit w = isDigit w || isLowAF w++fromLowHexDigit :: Num a => Word8 -> Maybe a+fromLowHexDigit w | isDigit w = Just $ unsafeFromDigit w+                  | isLowAF w = Just $ fromLowAF w+                  | otherwise = Nothing+#if __GLASGOW_HASKELL__ >= 700+{-# INLINABLE fromLowHexDigit #-}+#endif++unsafeFromLowHexDigit :: Num a => Word8 -> a+unsafeFromLowHexDigit w | w < ascii 'a' = unsafeFromDigit w+                        | otherwise     = fromLowAF w+{-# INLINE unsafeFromLowHexDigit #-}++isUpAF :: Word8 -> Bool+isUpAF w = w >= ascii 'A' && w <= ascii 'F'+{-# INLINE isUpAF #-}++fromUpAF :: Num a => Word8 -> a+fromUpAF w = fromIntegral (w - ascii 'A' + 10)+{-# INLINE fromUpAF #-}++isUpHexDigit :: Word8 -> Bool+isUpHexDigit w = isDigit w || isUpAF w++fromUpHexDigit :: Num a => Word8 -> Maybe a+fromUpHexDigit w | isDigit w = Just $ unsafeFromDigit w+                 | isUpAF w  = Just $ fromUpAF w+                 | otherwise = Nothing+#if __GLASGOW_HASKELL__ >= 700+{-# INLINABLE fromUpHexDigit #-}+#endif++unsafeFromUpHexDigit :: Num a => Word8 -> a+unsafeFromUpHexDigit w | w < ascii 'A' = unsafeFromDigit w+                       | otherwise     = fromUpAF w+{-# INLINE unsafeFromUpHexDigit #-}++isHexDigit :: Word8 -> Bool+isHexDigit w = isDigit w || isUpAF w || isLowAF w++fromHexDigit :: Num a => Word8 -> Maybe a+fromHexDigit w | isDigit w = Just $ unsafeFromDigit w+               | isUpAF w  = Just $ fromUpAF w+               | isLowAF w = Just $ fromLowAF w+               | otherwise = Nothing+#if __GLASGOW_HASKELL__ >= 700+{-# INLINABLE fromHexDigit #-}+#endif++unsafeFromHexDigit :: Num a => Word8 -> a+unsafeFromHexDigit w | w < ascii 'A' = unsafeFromDigit w+                     | w < ascii 'a' = fromUpAF w+                     | otherwise     = fromLowAF w+{-# INLINE unsafeFromHexDigit #-}
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright Michael Snoyman 2011, Typeclass Consulting LLC 2018++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 Michael Snoyman 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.
+ Setup.hs view
@@ -0,0 +1,3 @@+#!/usr/bin/env runhaskell+import Distribution.Simple+main = defaultMain
+ data-ascii.cabal view
@@ -0,0 +1,35 @@+cabal-version: 2.0++Name:                data-ascii+Version:             1.0.0.0+Synopsis:            Type-safe, bytestring-based ASCII values+Description:         Type-safe, bytestring-based ASCII values.+License:             BSD3+License-file:        LICENSE+Author:              Michael Snoyman+Maintainer:          Chris Martin, Julie Moronuki+Stability:           Stable+Category:            Data+Homepage:            https://github.com/typeclasses/ascii+Bug-Reports:         https://github.com/typeclasses/ascii/issues+Build-type:          Simple+Tested-with:         GHC == 8.8.1, GHC == 8.6.5, GHC == 8.4.3++Source-Repository head+    Type:     git+    Location: git://github.com/typeclasses/ascii.git++Library+  Default-language:    Haskell2010+  Exposed-modules:     Data.Ascii+                     , Data.Ascii.Blaze+                     , Data.Ascii.ByteString+                     , Data.Ascii.Word8+  Build-depends:       base             >= 4             && < 5+                     , bytestring       >= 0.9           && < 0.11+                     , text             >= 0.11          && < 1.3+                     , blaze-builder    >= 0.4           && < 0.5+                     , case-insensitive >= 0.2           && < 1.3+                     , hashable         >= 1.0           && < 1.4+                     , semigroups+  Ghc-options:         -Wall