packages feed

foundation 0.0.18 → 0.0.19

raw patch · 24 files changed

+138/−79 lines, 24 filesdep ~basedep ~basementPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: base, basement

API changes (from Hackage documentation)

- Foundation.Monad.Except: instance (GHC.Base.Functor m, GHC.Base.Monad m) => GHC.Base.Applicative (Foundation.Monad.Except.ExceptT e m)
- Foundation.Monad.Except: instance GHC.Base.Monad m => Basement.Monad.MonadFailure (Foundation.Monad.Except.ExceptT e m)
- Foundation.Monad.Except: instance GHC.Base.Monad m => GHC.Base.Monad (Foundation.Monad.Except.ExceptT e m)
- Foundation.Monad.Reader: instance GHC.Base.Monad m => Foundation.Monad.Reader.MonadReader (Foundation.Monad.Reader.ReaderT r m)
- Foundation.Monad.Reader: instance GHC.Base.Monad m => GHC.Base.Monad (Foundation.Monad.Reader.ReaderT r m)
- Foundation.Primitive: class IntegralCast a b
- Foundation.Primitive: integralCast :: IntegralCast a b => a -> b
- Foundation.String.Builder: data Builder
- Foundation.String.Builder: emit :: String -> Builder
- Foundation.String.Builder: emitChar :: Char -> Builder
- Foundation.String.Builder: instance Data.Semigroup.Semigroup Foundation.String.Builder.Builder
- Foundation.String.Builder: instance Data.String.IsString Foundation.String.Builder.Builder
- Foundation.String.Builder: instance GHC.Base.Monoid Foundation.String.Builder.Builder
+ Foundation.Monad.Except: instance Basement.Compat.AMP.AMPMonad m => Basement.Monad.MonadFailure (Foundation.Monad.Except.ExceptT e m)
+ Foundation.Monad.Except: instance Basement.Compat.AMP.AMPMonad m => GHC.Base.Applicative (Foundation.Monad.Except.ExceptT e m)
+ Foundation.Monad.Except: instance Basement.Compat.AMP.AMPMonad m => GHC.Base.Monad (Foundation.Monad.Except.ExceptT e m)
+ Foundation.Monad.Reader: instance Basement.Compat.AMP.AMPMonad m => Foundation.Monad.Reader.MonadReader (Foundation.Monad.Reader.ReaderT r m)
+ Foundation.Monad.Reader: instance Basement.Compat.AMP.AMPMonad m => GHC.Base.Monad (Foundation.Monad.Reader.ReaderT r m)
- Foundation.Monad: class Monad m => MonadFailure (m :: * -> *) where {
+ Foundation.Monad: class AMPMonad m => MonadFailure (m :: * -> *) where {
- Foundation.Monad: class Monad m => MonadThrow m
+ Foundation.Monad: class AMPMonad m => MonadThrow m
- Foundation.Monad: lift :: (MonadTrans trans, Monad m) => m a -> trans m a
+ Foundation.Monad: lift :: (MonadTrans trans, AMPMonad m) => m a -> trans m a
- Foundation.Monad.Reader: class Monad m => MonadReader m where {
+ Foundation.Monad.Reader: class AMPMonad m => MonadReader m where {
- Foundation.Primitive: class Eq ty => PrimType ty
+ Foundation.Primitive: class Eq ty => PrimType ty where {

Files

CHANGELOG.md view
@@ -1,3 +1,10 @@+## 0.0.19++* Add Block, UArray, String Builder+* Improve concat for Block andd UArray+* Add unicode case mapping+* Re-add compatibility with ghc 7.8+ ## 0.0.18  * Add missing lowlevel Block functionality
Foundation/Array/Bitmap.hs view
@@ -13,6 +13,7 @@ -- unnecessary churn. -- {-# LANGUAGE BangPatterns #-}+{-# LANGUAGE DeriveDataTypeable #-} module Foundation.Array.Bitmap     ( Bitmap     , MutableBitmap@@ -46,6 +47,7 @@ import qualified Data.List  data Bitmap = Bitmap (CountOf Bool) (UArray Word32)+    deriving (Typeable)  data MutableBitmap st = MutableBitmap (CountOf Bool) (MUArray Word32 st) 
Foundation/Check.hs view
@@ -37,6 +37,7 @@     ) where  import           Basement.Imports+import           Basement.Cast (cast) import           Basement.IntegralConv import           Basement.Types.OffsetSize import           Foundation.Check.Gen@@ -80,7 +81,7 @@                                       | otherwise -> return (PropertySuccess, iter)         where           iterW64 :: Word64-          iterW64 = let (CountOf iter') = iter in integralCast (integralUpsize iter' :: Int64)+          iterW64 = let (CountOf iter') = iter in cast (integralUpsize iter' :: Int64)            -- TODO revisit to let through timeout and other exception like ctrl-c or thread killing.           toResult :: IO (PropertyResult, Bool)
Foundation/Check/Arbitrary.hs view
@@ -14,6 +14,7 @@ import           Basement.Imports import           Foundation.Primitive import           Basement.Nat+import           Basement.Cast (cast) import           Basement.IntegralConv import           Basement.Bounded import           Basement.Types.OffsetSize@@ -81,11 +82,11 @@  instance Arbitrary String where     arbitrary = genWithParams $ \params ->-        fromList <$> (genMax (genMaxSizeString params) >>= \i -> replicateM (integralCast i) arbitrary)+        fromList <$> (genMax (genMaxSizeString params) >>= \i -> replicateM (cast i) arbitrary)  instance Arbitrary AsciiString where     arbitrary = genWithParams $ \params ->-        fromList <$> (genMax (genMaxSizeString params) >>= \i -> replicateM (integralCast i) arbitrary)+        fromList <$> (genMax (genMaxSizeString params) >>= \i -> replicateM (cast i) arbitrary)  instance Arbitrary Float where     arbitrary = arbitraryF32@@ -116,7 +117,7 @@  instance Arbitrary a => Arbitrary [a] where     arbitrary = genWithParams $ \params ->-        fromList <$> (genMax (genMaxSizeArray params) >>= \i -> replicateM (integralCast i) arbitrary)+        fromList <$> (genMax (genMaxSizeArray params) >>= \i -> replicateM (cast i) arbitrary) #if __GLASGOW_HASKELL__ >= 710 instance (Arbitrary a, KnownNat n, NatWithinBound Int n) => Arbitrary (ListN.ListN n a) where     arbitrary = ListN.replicateM arbitrary@@ -153,7 +154,7 @@ arbitraryWord64 = genWithRng getRandomWord64  arbitraryInt64 :: Gen Int64-arbitraryInt64 = integralCast <$> arbitraryWord64+arbitraryInt64 = cast <$> arbitraryWord64  arbitraryF64 :: Gen Double arbitraryF64 = genWithRng getRandomF64@@ -163,7 +164,7 @@  arbitraryUArrayOf :: (PrimType ty, Arbitrary ty) => Word -> Gen (UArray ty) arbitraryUArrayOf size = between (0, size) >>=-    \sz -> fromList <$> replicateM (integralCast sz) arbitrary+    \sz -> fromList <$> replicateM (cast sz) arbitrary  -- | Call one of the generator weighted frequency :: NonEmpty [(Word, Gen a)] -> Gen a
Foundation/Check/Main.hs view
@@ -17,6 +17,7 @@  import           Basement.Imports import           Basement.IntegralConv+import           Basement.Cast (cast) import           Basement.Bounded import           Basement.Types.OffsetSize import qualified Basement.Terminal.ANSI as ANSI@@ -285,7 +286,7 @@     params <- getGenParams . config <$> get     maxTests <- numTests . config <$> get -    (res,nb) <- liftIO $ iterateProperty (CountOf $ integralDownsize (integralCast maxTests :: Int64)) params rngIt prop+    (res,nb) <- liftIO $ iterateProperty (CountOf $ integralDownsize (cast maxTests :: Int64)) params rngIt prop     case res of         PropertyFailed {} -> failed         PropertySuccess   -> passed
Foundation/Exception.hs view
@@ -9,7 +9,7 @@ import Foundation.Monad.Exception  finally :: MonadBracket m => m a -> m b -> m a-finally f g = generalBracket (pure ()) (\() a -> g >> pure a) (\() _ -> g) (const f)+finally f g = generalBracket (return ()) (\() a -> g >> return a) (\() _ -> g) (const f)  try :: (MonadCatch m, Exception e) => m a -> m (Either e a) try a = catch (a >>= \ v -> return (Right v)) (\e -> return (Left e))
Foundation/Hashing/Hashable.hs view
@@ -13,6 +13,7 @@     ) where  import           Basement.Imports+import           Basement.Cast (cast) import           Basement.Compat.Natural import           Basement.Types.Word128 import           Basement.Types.Word256@@ -58,13 +59,13 @@             let b = integralDownsize (w :: Natural) :: Word8              in loop (w `div` 256) (hashMix8 b acc) instance Hashable Int8 where-    hashMix w = hashMix8 (integralCast w)+    hashMix w = hashMix8 (cast w) instance Hashable Int16 where-    hashMix w = hashMix16 (integralCast w)+    hashMix w = hashMix16 (cast w) instance Hashable Int32 where-    hashMix w = hashMix32 (integralCast w)+    hashMix w = hashMix32 (cast w) instance Hashable Int64 where-    hashMix w = hashMix64 (integralCast w)+    hashMix w = hashMix64 (cast w) instance Hashable Integer where     hashMix i iacc         | i == 0    = hashMix8 0 iacc
Foundation/Hashing/SipHash.hs view
@@ -21,6 +21,7 @@ import           Basement.Compat.Base import           Basement.Types.OffsetSize import           Basement.PrimType+import           Basement.Cast (cast) import           Basement.IntegralConv import           Foundation.Hashing.Hasher import qualified Basement.UArray as A@@ -175,7 +176,7 @@         SipIncremental7 acc -> process c ist (lenMask .|. acc)   where     lenMask = (wlen .&. 0xff) .<<. 56-    wlen = integralCast (integralUpsize len :: Int64) :: Word64+    wlen = cast (integralUpsize len :: Int64) :: Word64  -- | same as 'hash', except also specifies the number of sipround iterations for compression (C) and digest (D). mixBa :: PrimType a => Int -> UArray a -> Sip -> Sip@@ -202,7 +203,7 @@                         .|. to64 0  (primBaIndex ba (ofs + Offset 7))                 in loop8 (process c st v) SipIncremental0 (start + Offset 8) l8         loop8 !st !incr !ofs !l = loop1 st incr ofs l-        loop1 !st !incr !ofs !l = case l - 1 of +        loop1 !st !incr !ofs !l = case l - 1 of             Nothing -> Sip st incr (currentLen + totalLen)             Just l1 -> let (!st', !incr') = mix8Prim c (primBaIndex ba ofs) st incr                         in loop1 st' incr' (ofs + Offset 1) l1
Foundation/Monad/Except.hs view
@@ -1,9 +1,11 @@ {-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE ConstraintKinds #-} module Foundation.Monad.Except     ( ExceptT(..)     ) where  import Basement.Imports+import Basement.Compat.AMP import Foundation.Monad.Base import Foundation.Monad.Reader @@ -12,7 +14,7 @@ instance Functor m => Functor (ExceptT e m) where     fmap f = ExceptT . fmap (fmap f) . runExceptT -instance (Functor m, Monad m) => Applicative (ExceptT e m) where+instance AMPMonad m => Applicative (ExceptT e m) where     pure a = ExceptT $ pure (Right a)     ExceptT f <*> ExceptT v = ExceptT $ do         mf <- f@@ -24,11 +26,11 @@                     Left e -> pure (Left e)                     Right x -> pure (Right (k x)) -instance Monad m => MonadFailure (ExceptT e m) where+instance AMPMonad m => MonadFailure (ExceptT e m) where     type Failure (ExceptT e m) = e     mFail = ExceptT . pure . Left -instance Monad m => Monad (ExceptT e m) where+instance AMPMonad m => Monad (ExceptT e m) where     return a = ExceptT $ return (Right a)     m >>= k = ExceptT $ do         a <- runExceptT m
Foundation/Monad/Exception.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE ConstraintKinds #-} module Foundation.Monad.Exception     ( MonadThrow(..)     , MonadCatch(..)@@ -6,10 +7,11 @@     ) where  import           Basement.Compat.Base+import           Basement.Compat.AMP import qualified Control.Exception as E  -- | Monad that can throw exception-class Monad m => MonadThrow m where+class AMPMonad m => MonadThrow m where     -- | Throw immediatity an exception.     -- Only a 'MonadCatch' monad will be able to catch the exception using 'catch'     throw :: Exception e => e -> m a
Foundation/Monad/MonadIO.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE ConstraintKinds #-} module Foundation.Monad.MonadIO     ( MonadIO(..)     ) where@@ -7,9 +8,10 @@ import Control.Monad.IO.Class #else import Basement.Compat.Base+import Basement.Compat.AMP  -- | Monads in which 'IO' computations may be embedded.-class Monad m => MonadIO m where+class AMPMonad m => MonadIO m where     -- | Lift a computation from the 'IO' monad.     liftIO :: IO a -> m a 
Foundation/Monad/Reader.hs view
@@ -3,6 +3,7 @@ -- -- This is useful to keep a non-modifiable value -- in a context+{-# LANGUAGE ConstraintKinds #-} module Foundation.Monad.Reader     ( -- * MonadReader       MonadReader(..)@@ -12,10 +13,11 @@     ) where  import Basement.Compat.Base (($), (.), const)+import Basement.Compat.AMP import Foundation.Monad.Base import Foundation.Monad.Exception -class Monad m => MonadReader m where+class AMPMonad m => MonadReader m where     type ReaderContext m     ask :: m (ReaderContext m) @@ -32,7 +34,7 @@     fab <*> fa = ReaderT $ \r -> runReaderT fab r <*> runReaderT fa r     {-# INLINE (<*>) #-} -instance Monad m => Monad (ReaderT r m) where+instance AMPMonad m => Monad (ReaderT r m) where     return a = ReaderT $ const (return a)     {-# INLINE return #-}     ma >>= mab = ReaderT $ \r -> runReaderT ma r >>= \a -> runReaderT (mab a) r@@ -64,6 +66,6 @@                               (\a exn -> runReaderT (cleanupExcept a exn) c)                               (\a -> runReaderT (innerAction a) c) -instance Monad m => MonadReader (ReaderT r m) where+instance AMPMonad m => MonadReader (ReaderT r m) where     type ReaderContext (ReaderT r m) = r     ask = ReaderT return
Foundation/Monad/Transformer.hs view
@@ -1,10 +1,12 @@+{-# LANGUAGE ConstraintKinds #-} module Foundation.Monad.Transformer     ( MonadTrans(..)     ) where  import Basement.Compat.Base+import Basement.Compat.AMP  -- | Basic Transformer class class MonadTrans trans where     -- | Lift a computation from an inner monad to the current transformer monad-    lift :: Monad m => m a -> trans m a+    lift :: AMPMonad m => m a -> trans m a
Foundation/Primitive.hs view
@@ -19,7 +19,6 @@     -- * Integral convertion     , IntegralUpsize(..)     , IntegralDownsize(..)-    , IntegralCast(..)      -- * Evaluation     , NormalForm(..)
Foundation/String/Builder.hs view
@@ -5,51 +5,20 @@ -- -- String Builder ----- This is extremely bad implementation of a builder implementation--- but provide a very similar API to the future fast implementation;--- So, in the spirit of getting started and to be able to start using--- the API, we don't wait for the fast implementation. module Foundation.String.Builder-    ( Builder-    , emit-    , emitChar+    ( module Basement.String.Builder     , toString     ) where -import           Basement.Compat.Base-import           Basement.Compat.Semigroup-import           Basement.String                (String)-import qualified Basement.String as S--data Builder = E String | T [Builder]--instance IsString Builder where-    fromString = E . fromString--instance Semigroup Builder where-    (<>) = append-instance Monoid Builder where-    mempty = empty-    mappend = append-    mconcat = concat--empty :: Builder-empty = T []--emit :: String -> Builder-emit s = E s--emitChar :: Char -> Builder-emitChar c = E (S.singleton c)+import Basement.String.Builder+import Basement.String (String)+import GHC.ST +-- | run the builder and return a `String`+--+-- alias to `runUnsafe`+--+-- This function is not safe, prefer `run`.+-- toString :: Builder -> String-toString = mconcat . flatten-  where-    flatten (E s) = [s]-    flatten (T l) = mconcat $ fmap flatten l--append :: Builder -> Builder -> Builder-append a b = T [a,b]--concat :: [Builder] -> Builder-concat = T+toString builder = runST (runUnsafe builder)
Foundation/Timing.hs view
@@ -13,8 +13,11 @@     , measure     ) where -import           Basement.Imports-import           Basement.IntegralConv+import           Basement.Imports hiding (from)+import           Basement.From (from)+#if __GLASGOW_HASKELL__ < 802+import           Basement.Cast (cast)+#endif import           Basement.Monad -- import           Basement.UArray hiding (unsafeFreeze) import           Basement.UArray.Mutable (MUArray)@@ -57,7 +60,7 @@     if r then pure Nothing else Just <$> GHC.getGCStats  diffGC :: Maybe GHC.GCStats -> Maybe GHC.GCStats -> Maybe Word64-diffGC gc2 gc1 = integralCast <$> (((-) `on` GHC.bytesAllocated) <$> gc2 <*> gc1)+diffGC gc2 gc1 = cast <$> (((-) `on` GHC.bytesAllocated) <$> gc2 <*> gc1) #endif  -- | Simple one-time measurement of time & other metrics spent in a function@@ -72,7 +75,7 @@ -- | In depth timing & other metrics analysis of a function measure :: Word -> (a -> b) -> a -> IO Measure measure nbIters f a = do-    d <- mutNew (integralCast nbIters) :: IO (MUArray NanoSeconds (PrimState IO))+    d <- mutNew (from nbIters) :: IO (MUArray NanoSeconds (PrimState IO))     loop d 0     Measure <$> unsafeFreeze d             <*> pure nbIters@@ -81,5 +84,5 @@         | i == nbIters = return ()         | otherwise    = do             (_, r) <- measuringNanoSeconds (evaluate $ f a)-            mutUnsafeWrite d (integralCast i) r+            mutUnsafeWrite d (from i) r             loop d (i+1)
LICENSE view
@@ -1,5 +1,5 @@ Copyright (c) 2015-2017 Vincent Hanquez <vincent@snarc.org>-Copyright (c) 2017      Foundation Maintainers+Copyright (c) 2017-2018 Foundation Maintainers  All rights reserved. 
benchs/Fake/ByteString.hs view
@@ -17,6 +17,7 @@     , readInt     , readInteger     , unpack+    , concat     ) where  import Prelude (undefined, Maybe(..))@@ -41,6 +42,8 @@ and _ _ = undefined all _ _ = undefined any _ _ = undefined+concat :: [ByteString] -> ByteString+concat _ = undefined unpack :: ByteString -> [Word8] unpack = undefined 
benchs/Fake/Vector.hs view
@@ -15,6 +15,7 @@     , and     , all     , any+    , concat     ) where  import Prelude (undefined)@@ -40,3 +41,4 @@ and _ _ = undefined all _ _ = undefined any _ _ = undefined+concat = undefined
benchs/Main.hs view
@@ -13,6 +13,7 @@ import Foundation.String import BenchUtil.Common import BenchUtil.RefData+import qualified Basement.Block.Builder as Builder  import Sys @@ -179,6 +180,8 @@     , benchFoldr     , benchReverse     , benchFilter+    , benchMonoidConcat+    , benchBuilderBlock     , benchAll     , benchSort     , benchSort32@@ -204,11 +207,36 @@         t = ByteString.pack dat         v = Vector.fromList dat +    diffListByteArray :: ([UArray Word8] -> a)+                      -> ([Block Word8] -> b)+                      -> ([ByteString.ByteString] -> c)+                      -> ([Vector.Vector Word8] -> d)+                      -> [[Word8]]+                      -> [Benchmark]+    diffListByteArray uarrayBench blockBench bsBench vectorBench dat =+        [ bench "[UArray_W8]" $ whnf uarrayBench s+        , bench "[Block_W8]" $ whnf blockBench s'+#ifdef BENCH_ALL+        , bench "[ByteString]" $ whnf bsBench t+        , bench "[Vector_W8]" $ whnf vectorBench v+#endif+        ]+      where+        s = fromList <$> dat+        s' = fromList <$> dat+        t = ByteString.pack <$> dat+        v = Vector.fromList <$> dat+     allDat =         [ ("bs20", rdBytes20)         , ("bs200", rdBytes200)         , ("bs2000", rdBytes2000)         ]+    allListDat =+        [ ("listBs20", Prelude.replicate 20 rdBytes20)+        , ("listBs200", Prelude.replicate 200 rdBytes200)+        , ("listBs2000", Prelude.replicate 2000 rdBytes2000)+        ]     allDatSuffix s = fmap (first (\x -> x <> "-" <> s)) allDat      benchLength = bgroup "Length" $@@ -269,6 +297,15 @@         fmap (\(n, dat) -> bgroup n $ diffByteArray (filter (> 100)) (filter (> 100))                                                     (ByteString.filter (> 100))                                                     (Vector.filter (> 100)) dat) allDat++    benchMonoidConcat = bgroup "Monoid/mconcat" $+        fmap (\(n, dat) -> bgroup n $ diffListByteArray mconcat mconcat ByteString.concat Vector.concat dat) allListDat+    benchBuilderBlock = bgroup "Monoid/builder" $+        [ bench "[block Word8]" $ whnf builderConcat (Prelude.replicate 2000 (fromList rdBytes2000))+        ]+      where+        builderConcat :: [Block Word8] -> Block Word8+        builderConcat l = runST $ Builder.run $ mconcat (fmap Builder.emit l)      benchSort = bgroup "Sort" $ fmap (\(n, dat) ->         bgroup n $
foundation.cabal view
@@ -1,5 +1,5 @@ name:                foundation-version:             0.0.18+version:             0.0.19 synopsis:            Alternative prelude with batteries and no dependencies description:     A custom prelude with no dependencies apart from base.@@ -191,7 +191,7 @@                       BangPatterns                       DeriveDataTypeable   build-depends:     base >= 4.7 && < 5-                   , basement == 0.0.5+                   , basement == 0.0.6                    , ghc-prim   -- FIXME add suport for armel mipsel   --  CPP-options: -DARCH_IS_LITTLE_ENDIAN
tests/Test/Data/List.hs view
@@ -8,11 +8,13 @@     ) where  import Foundation-import Foundation.Primitive import Foundation.Collection (nonEmpty_, NonEmpty) import Foundation.Check import Foundation.Monad +import Basement.From (from)+import Basement.Cast (cast)+ -- | convenient function to replicate thegiven Generator of `e` a randomly -- choosen amount of time. generateListOfElement :: Gen e -> Gen [e]@@ -21,19 +23,19 @@ -- | convenient function to generate up to a certain amount of time the given -- generator. generateListOfElementMaxN :: CountOf e -> Gen e -> Gen [e]-generateListOfElementMaxN (CountOf n) e = replicateBetween 0 (integralCast n) e+generateListOfElementMaxN n e = replicateBetween 0 (from n) e  generateNonEmptyListOfElement :: CountOf e -> Gen e -> Gen (NonEmpty [e])-generateNonEmptyListOfElement (CountOf n) e = nonEmpty_ <$> replicateBetween 1 (integralCast n) e+generateNonEmptyListOfElement n e = nonEmpty_ <$> replicateBetween 1 (from n) e  data RandomList = RandomList [Int]     deriving (Show,Eq)  instance Arbitrary RandomList where-    arbitrary = RandomList <$> replicateBetween 100 400 (integralCast <$> between (0,8))+    arbitrary = RandomList <$> replicateBetween 100 400 (cast <$> between (0,8))  replicateBetween n1 n2 f =     between (n1, n2) >>= \n -> replicateM (CountOf (toInt n)) f   where     toInt :: Word -> Int-    toInt = integralCast+    toInt = cast
tests/Test/Foundation/Network/IPv6.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP               #-} {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE OverloadedStrings #-} module Test.Foundation.Network.IPv6@@ -27,6 +28,7 @@  testNetworkIPv6 :: Test testNetworkIPv6 = Group "IPv6"+#if __GLASGOW_HASKELL__ >= 710     [ Property "toTuple . fromTuple == id" $         forAll genIPv6Tuple $ \x -> x === toTuple (fromTuple x)     , Property "toString . fromString == id" $@@ -46,3 +48,6 @@         , Property "0:0::FFFF:129.144.52.38" $ (fromTuple (0,0,0,0,0,0xffff,0x8190,0x3426)) === (fromString "0:0::FFFF:129.144.52.38")         ]     ]+#else+    []+#endif
tests/Test/Foundation/String.hs view
@@ -59,6 +59,21 @@               "this is only a simple string but quite longer than the 64 bytes used in the modified UTF8 parser"               "this is only a simple string but quite longer than the 64 bytes used in the modified UTF8 parser"         ]+    , Group "CaseMapping" +         [ Property "upper . upper == upper" $ \l ->+             let s = fromList l+              in upper (upper s) === upper s+         , CheckPlan "a should capitalize to A" $ validate "a" $ upper "a" == "A"+         , CheckPlan "b should capitalize to B" $ validate "b" $ upper "b" == "B"+         , CheckPlan "B should not capitalize" $ validate "B" $ upper "B" == "B"+         , CheckPlan "é should capitalize to É" $ validate "é" $ upper "é" == "É"+         , CheckPlan "ß should capitalize to SS" $ validate "ß" $ upper "ß" == "SS"+         , CheckPlan "ffl should capitalize to FFL" $ validate "ffl" $ upper "ffl" == "FFL"+         , CheckPlan "0a should capitalize to 0A" $ validate "0a" $ upper "\0a" == "\0A"+         , CheckPlan "0a should capitalize to 0A" $ validate "0a" $ upper "a\0a" == "A\0A"+         , CheckPlan "0a should capitalize to 0A" $ validate "0a" $ upper "\0\0" == "\0\0"+         , CheckPlan "00 should not capitalize" $ validate "00" $ upper "00" == "00"+        ]     {-     , testGroup "replace" [           testCase "indices '' 'bb' should raise an error" $ do