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 +61/−0
- Data/Ascii/Blaze.hs +27/−0
- Data/Ascii/ByteString.hs +75/−0
- Data/Ascii/Word8.hs +148/−0
- LICENSE +30/−0
- Setup.hs +3/−0
- data-ascii.cabal +35/−0
+ 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