1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module General.String(
BS, pack, unpack, pack_, unpack_,
BSU, packU, unpackU, packU_, unpackU_, requireU
) where
import qualified Data.ByteString as BS (any)
import qualified Data.ByteString.Char8 as BS hiding (any)
import qualified Data.ByteString.UTF8 as UTF8
import Development.Shake.Classes
---------------------------------------------------------------------
-- Data.ByteString
-- Mostly because ByteString does not have an NFData instance in older GHC
-- | ASCII ByteString
newtype BS = BS BS.ByteString
deriving (Hashable, Binary, Eq)
instance Show BS where
show (BS x) = show x
instance NFData BS where
-- some versions of ByteString do not have NFData instances, but seq is equivalent
-- for a strict bytestring. Therefore, we write our own instance.
rnf (BS x) = x `seq` ()
-- | UTF8 ByteString
newtype BSU = BSU BS.ByteString
deriving (Hashable, Binary, Eq)
instance NFData BSU where
rnf (BSU x) = x `seq` ()
pack :: String -> BS
pack = pack_ . BS.pack
unpack :: BS -> String
unpack = BS.unpack . unpack_
pack_ :: BS.ByteString -> BS
pack_ = BS
unpack_ :: BS -> BS.ByteString
unpack_ (BS x) = x
packU :: String -> BSU
packU = packU_ . UTF8.fromString
unpackU :: BSU -> String
unpackU = UTF8.toString . unpackU_
unpackU_ :: BSU -> BS.ByteString
unpackU_ (BSU x) = x
packU_ :: BS.ByteString -> BSU
packU_ = BSU
requireU :: BSU -> Bool
requireU = BS.any (>= 0x80) . unpackU_
|