witch 0.3.2.1 → 0.3.2.2
raw patch · 7 files changed
+1822/−1797 lines, 7 filesdep +HUnitdep −hspecPVP ok
version bump matches the API change (PVP)
Dependencies added: HUnit
Dependencies removed: hspec
API changes (from Hackage documentation)
Files
- src/lib/Witch.hs +81/−13
- src/lib/Witch/From.hs +9/−3
- src/lib/Witch/Instances.hs +8/−2
- src/lib/Witch/TryFrom.hs +9/−3
- src/lib/Witch/Utility.hs +2/−2
- src/test/Main.hs +1711/−1772
- witch.cabal +2/−2
src/lib/Witch.hs view
@@ -5,9 +5,9 @@ -- -- >>> import Witch ----- In typical usage, you will most likely use 'Witch.Utility.into' for--- 'Witch.From.From' instances and 'With.Utility.tryInto' for--- 'Witch.TryFrom.TryFrom' instances.+-- In typical usage, the functions that you will use most often are+-- 'Witch.Utility.into' for conversions that always succeed and+-- 'Witch.Utility.tryInto' for conversions that sometimes fail. module Witch ( -- * Type classes @@ -19,6 +19,9 @@ , Witch.TryFrom.TryFrom(tryFrom) , Witch.Utility.tryInto + -- * Data types+ , Witch.TryFromException.TryFromException(..)+ -- * Utilities , Witch.Utility.as , Witch.Utility.over@@ -48,9 +51,6 @@ , Witch.Lift.liftedFrom , Witch.Lift.liftedInto - -- * Data types- , Witch.TryFromException.TryFromException(..)- -- * Notes -- ** Motivation@@ -67,6 +67,37 @@ -- by the [@From@](https://doc.rust-lang.org/std/convert/trait.From.html) -- trait in Rust. + -- ** Type applications+ -- | Although you can use this library without the [@TypeApplication@](https://downloads.haskell.org/~ghc/9.0.1/docs/html/users_guide/exts/type_applications.html)+ -- language extension, the extension is strongly recommended. Since most+ -- functions provided by this library are polymorphic in at least one type+ -- variable, it's easy to use them in a situation that would be ambiguous.+ -- Normally you could resolve the ambiguity with an explicit type signature,+ -- but type applications are much more ergonomic. For example:+ --+ -- > -- Avoid this:+ -- > f . (from :: Int8 -> Int16) . g+ -- >+ -- > -- Prefer this:+ -- > f . from @Int8 @Int16 . g+ --+ -- Most functions in this library have two versions with their type+ -- variables in opposite orders. That's because usually one side of the+ -- conversion or the other already has its type inferred by context. In+ -- those situations it makes sense to only provide one type argument.+ --+ -- > -- Avoid this: (assuming f :: Int16 -> ...)+ -- > f $ from @Int8 @Int16 0+ -- >+ -- > -- Prefer this:+ -- > f $ from @Int8 0+ --+ -- > -- Avoid this: (assuming x :: Int8)+ -- > g $ from @Int8 @Int16 x+ -- >+ -- > -- Prefer this:+ -- > g $ into @Int16 x+ -- ** Alternatives -- | Many Haskell libraries already provide similar functionality. How is -- this library different?@@ -137,24 +168,61 @@ -- @from \@b \@a . from \@a \@b@ should be the same as 'id'. In other -- words, @a@ and @b@ are isomorphic. --- -- - This often true, but not always. For example, converting a list into- -- a set will remove duplicates. And then converting back into a list- -- will put the elements in ascending order.+ -- - This often true, but not always. For example, converting a list+ -- into a set will remove duplicates. And then converting back into a+ -- list will put the elements in ascending order. -- -- - If you have both @From a b@ and @From b c@, then you could also have -- @From a c@ and it should be the same as @from \@b \@c . from \@a \@b@. -- In other words, @From@ is transitive. --- -- - This is not always true. For example an @Int8@ may be represented as- -- a number in JSON, whereas an @Int64@ might be represented as a- -- string. That means @into \@JSON (into \@Int64 int8)@ would not be the- -- same as @into \@JSON int8@.+ -- - This is not always true. For example an @Int8@ may be represented+ -- as a number in JSON, whereas an @Int64@ might be represented as a+ -- string. That means @into \@JSON (into \@Int64 int8)@ would not be+ -- the same as @into \@JSON int8@. --+ -- - You should not have both a @From@ instance and a @TryFrom@ instance for+ -- the same pair of types.+ -- -- In general if @s@ /is/ a @t@, then you should add a 'Witch.From.From' -- instance for it. But if @s@ merely /can be/ a @t@, then you could add a -- 'Witch.TryFrom.TryFrom' instance for it. And if it is technically -- possible to convert from @s@ to @t@ but there are a lot of caveats, you -- probably should not write any instances at all.++ -- ** Integral types+ -- | There are a lot of types that represent various different ranges of+ -- integers, and Witch may not provide the instances you want. In particular+ -- it does not provide a total way to convert from an @Int32@ into an @Int@.+ -- Why is that?+ --+ -- The Haskell Language Report only demands that @Int@s have at least 30+ -- bits of precision. That means a reasonable Haskell implementation could+ -- have an @Int@ type that's smaller than the @Int32@ type.+ --+ -- However in practice everyone uses the same Haskell implementation: GHC.+ -- And with GHC the @Int@ type always has 32 bits of precision, even on+ -- 32-bit architectures. So for almost everybody, it's probably safe to use+ -- @unsafeFrom \@Int32 \@Int@. Similarly most software these days runs on+ -- machines with 64-bit architectures. That means it's also probably safe+ -- for you to use @unsafeFrom \@Int64 \@Int@.+ --+ -- All of the above also applies for @Word@, @Word32@, and @Word64@.++ -- ** Downsides+ -- | As the author of this library, I obviously think that everyone should+ -- use it because it's the greatest thing since sliced bread. But nothing is+ -- perfect, so what are some downsides to this library?+ --+ -- - More specific type classes are often better. For example, @IsString s@+ -- is more useful that @From String s@. The former says that the type @s@+ -- is the same as a string literal, but the latter just says you can+ -- produce a value of type @s@ when given a string.+ --+ -- - The @From@ type class works great for specific pairs of types, but can+ -- get confusing when it's polymorphic. For example if you have some+ -- function with a `From s t` constraint, that doesn't really tell you+ -- anything about what it's doing. ) where import qualified Witch.From
src/lib/Witch/From.hs view
@@ -10,11 +10,17 @@ -- you can convert from a value of type @source@ into a value of type -- @target@. ----- This type class is for conversions that cannot fail. If your conversion can--- fail, consider implementing @TryFrom@ instead.+-- This type class is for conversions that always succeed. If your conversion+-- sometimes fails, consider implementing @TryFrom@ instead. class From source target where -- | This method implements the conversion of a value between types. At call- -- sites you will usually want to use @into@ instead of this method.+ -- sites you may prefer to use @into@ instead.+ --+ -- > -- Avoid this:+ -- > from (x :: s)+ -- >+ -- > -- Prefer this:+ -- > from @s x -- -- The default implementation of this method simply calls 'Coerce.coerce', -- which works for types that have the same runtime representation. This
src/lib/Witch/Instances.hs view
@@ -37,6 +37,7 @@ import qualified Witch.TryFromException as TryFromException import qualified Witch.Utility as Utility +-- | Uses 'id'. instance From.From a a where from = id @@ -251,7 +252,10 @@ -- | Uses 'fromIntegral' when the input is not negative. instance TryFrom.TryFrom Int.Int64 Natural.Natural where- tryFrom = Utility.eitherTryFrom fromNonNegativeIntegral+ -- This should use @eitherTryFrom fromNonNegativeIntegral@, but that causes+ -- a bug in GHC 9.0.1.+ -- https://mail.haskell.org/pipermail/haskell-cafe/2021-March/133540.html+ tryFrom = Utility.eitherTryFrom $ \ s -> TryFrom.tryFrom (From.from s :: Integer) -- | Uses 'fromIntegral' when the input is between -16,777,215 and 16,777,215 -- inclusive.@@ -590,7 +594,9 @@ -- | Uses 'fromIntegral'. instance From.From Word.Word64 Natural.Natural where- from = fromIntegral+ -- This should use @fromIntegral@, but that causes a bug in GHC 9.0.1.+ -- https://mail.haskell.org/pipermail/haskell-cafe/2021-March/133540.html+ from s = Utility.unsafeFrom (From.from s :: Integer) -- | Uses 'Bits.toIntegralSized'. instance TryFrom.TryFrom Word.Word64 Int.Int8 where
src/lib/Witch/TryFrom.hs view
@@ -9,11 +9,17 @@ -- that you may be able to convert from a value of type @source@ into a value -- of type @target@, but that conversion may fail at runtime. ----- This type class is for conversions that can fail. If your conversion cannot--- fail, consider implementing @From@ instead.+-- This type class is for conversions that can sometimes fail. If your+-- conversion always succeeds, consider implementing @From@ instead. class TryFrom source target where -- | This method implements the conversion of a value between types. At call- -- sites you will usually want to use @tryInto@ instead of this method.+ -- sites you may want to use @tryInto@ instead.+ --+ -- > -- Avoid this:+ -- > tryFrom (x :: s)+ -- >+ -- > -- Prefer this:+ -- > tryFrom @s -- -- Consider using @maybeTryFrom@ or @eitherTryFrom@ to implement this -- method.
src/lib/Witch/Utility.hs view
@@ -96,9 +96,9 @@ -- -- > -- Avoid this: -- > case tryInto @u x of--- > Left _ -> Left ...+-- > Left (TryFromException _ e) -> Left $ TryFromException x e -- > Right y -> case tryFrom @u y of--- > Left _ -> Left ...+-- > Left (TryFromException _ e) -> Left $ TryFromException x e -- > Right z -> Right z -- > -- > -- Prefer this:
src/test/Main.hs view
@@ -1,1775 +1,1714 @@-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeApplications #-}--import qualified Control.Exception as Exception-import qualified Control.Monad as Monad-import qualified Data.ByteString as ByteString-import qualified Data.ByteString.Lazy as LazyByteString-import qualified Data.ByteString.Short as ShortByteString-import qualified Data.Complex as Complex-import qualified Data.Fixed as Fixed-import qualified Data.Int as Int-import qualified Data.IntMap as IntMap-import qualified Data.IntSet as IntSet-import qualified Data.List.NonEmpty as NonEmpty-import qualified Data.Map as Map-import qualified Data.Ratio as Ratio-import qualified Data.Sequence as Seq-import qualified Data.Set as Set-import qualified Data.Text as Text-import qualified Data.Text.Lazy as LazyText-import qualified Data.Time as Time-import qualified Data.Time.Clock.POSIX as Time-import qualified Data.Time.Clock.System as Time-import qualified Data.Time.Clock.TAI as Time-import qualified Data.Word as Word-import qualified Numeric.Natural as Natural-import qualified Test.Hspec as Hspec-import qualified Witch--main :: IO ()-main = Hspec.hspec . Hspec.describe "Witch" $ do-- Hspec.describe "From" $ do-- Hspec.describe "from" $ do- test $ Witch.from (1 :: Int.Int8) `Hspec.shouldBe` (1 :: Int.Int16)-- Hspec.describe "TryFrom" $ do-- Hspec.describe "tryFrom" $ do- let f = hush . Witch.tryFrom @Int.Int16 @Int.Int8- test $ f 1 `Hspec.shouldBe` Just 1- test $ f 128 `Hspec.shouldBe` Nothing-- Hspec.describe "Utility" $ do-- Hspec.describe "as" $ do- test $ Witch.as @Int.Int8 1 `Hspec.shouldBe` 1-- Hspec.describe "from" $ do- test $ Witch.from @Int.Int8 1 `Hspec.shouldBe` (1 :: Int.Int16)-- Hspec.describe "into" $ do- test $ Witch.into @Int.Int16 (1 :: Int.Int8) `Hspec.shouldBe` 1-- Hspec.describe "over" $ do- test $ Witch.over @Int.Int8 (+ 1) (Age 1) `Hspec.shouldBe` Age 2-- Hspec.describe "via" $ do- test $ Witch.via @Int.Int16 (1 :: Int.Int8) `Hspec.shouldBe` (1 :: Int.Int32)-- Hspec.describe "tryFrom" $ do- test $ hush (Witch.tryFrom @Int.Int16 1) `Hspec.shouldBe` Just (1 :: Int.Int8)-- Hspec.describe "tryInto" $ do- test $ hush (Witch.tryInto @Int.Int8 (1 :: Int.Int16)) `Hspec.shouldBe` Just 1-- Hspec.describe "tryVia" $ do- let f = Witch.tryVia @Int.Int16 @Int.Int32 @Int.Int8- test $ hush (f 1) `Hspec.shouldBe` Just 1- test $ hush (f 128) `Hspec.shouldBe` Nothing- test $ hush (f 32768) `Hspec.shouldBe` Nothing-- Hspec.describe "unsafeFrom" $ do- test $ Witch.unsafeFrom (1 :: Int.Int16) `Hspec.shouldBe` (1 :: Int.Int8)- test $ Exception.evaluate (Witch.unsafeFrom @Int.Int16 @Int.Int8 128) `Hspec.shouldThrow` Hspec.anyException-- Hspec.describe "unsafeInto" $ do- test $ Witch.unsafeInto @Int.Int8 (1 :: Int.Int16) `Hspec.shouldBe` 1-- Hspec.describe "Lift" $ do-- Hspec.describe "liftedFrom" $ do- test $ ($$(Witch.liftedFrom (1 :: Int.Int16)) :: Int.Int8) `Hspec.shouldBe` 1-- Hspec.describe "liftedInto" $ do- test $ $$(Witch.liftedInto @Int.Int8 (1 :: Int.Int16)) `Hspec.shouldBe` 1-- Hspec.describe "Instances" $ do-- -- Int8-- Hspec.describe "From Int8 Int16" $ do- let f = Witch.from @Int.Int8 @Int.Int16- test $ f 0 `Hspec.shouldBe` 0- test $ f 127 `Hspec.shouldBe` 127- test $ f (-128) `Hspec.shouldBe` (-128)-- Hspec.describe "From Int8 Int32" $ do- let f = Witch.from @Int.Int8 @Int.Int32- test $ f 0 `Hspec.shouldBe` 0- test $ f 127 `Hspec.shouldBe` 127- test $ f (-128) `Hspec.shouldBe` (-128)-- Hspec.describe "From Int8 Int64" $ do- let f = Witch.from @Int.Int8 @Int.Int64- test $ f 0 `Hspec.shouldBe` 0- test $ f 127 `Hspec.shouldBe` 127- test $ f (-128) `Hspec.shouldBe` (-128)-- Hspec.describe "From Int8 Int" $ do- let f = Witch.from @Int.Int8 @Int- test $ f 0 `Hspec.shouldBe` 0- test $ f 127 `Hspec.shouldBe` 127- test $ f (-128) `Hspec.shouldBe` (-128)-- Hspec.describe "From Int8 Integer" $ do- let f = Witch.from @Int.Int8 @Integer- test $ f 0 `Hspec.shouldBe` 0- test $ f 127 `Hspec.shouldBe` 127- test $ f (-128) `Hspec.shouldBe` (-128)-- Hspec.describe "TryFrom Int8 Word8" $ do- let f = hush . Witch.tryFrom @Int.Int8 @Word.Word8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 127 `Hspec.shouldBe` Just 127- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int8 Word16" $ do- let f = hush . Witch.tryFrom @Int.Int8 @Word.Word16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 127 `Hspec.shouldBe` Just 127- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int8 Word32" $ do- let f = hush . Witch.tryFrom @Int.Int8 @Word.Word32- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 127 `Hspec.shouldBe` Just 127- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int8 Word64" $ do- let f = hush . Witch.tryFrom @Int.Int8 @Word.Word64- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 127 `Hspec.shouldBe` Just 127- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int8 Word" $ do- let f = hush . Witch.tryFrom @Int.Int8 @Word- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 127 `Hspec.shouldBe` Just 127- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int8 Natural" $ do- let f = hush . Witch.tryFrom @Int.Int8 @Natural.Natural- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 127 `Hspec.shouldBe` Just 127- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "From Int8 Float" $ do- let f = Witch.from @Int.Int8 @Float- test $ f 0 `Hspec.shouldBe` 0- test $ f 127 `Hspec.shouldBe` 127- test $ f (-128) `Hspec.shouldBe` (-128)-- Hspec.describe "From Int8 Double" $ do- let f = Witch.from @Int.Int8 @Double- test $ f 0 `Hspec.shouldBe` 0- test $ f 127 `Hspec.shouldBe` 127- test $ f (-128) `Hspec.shouldBe` (-128)-- -- Int16-- Hspec.describe "TryFrom Int16 Int8" $ do- let f = hush . Witch.tryFrom @Int.Int16 @Int.Int8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 127 `Hspec.shouldBe` Just 127- test $ f 128 `Hspec.shouldBe` Nothing- test $ f (-128) `Hspec.shouldBe` Just (-128)- test $ f (-129) `Hspec.shouldBe` Nothing-- Hspec.describe "From Int16 Int32" $ do- let f = Witch.from @Int.Int16 @Int.Int32- test $ f 0 `Hspec.shouldBe` 0- test $ f 32767 `Hspec.shouldBe` 32767- test $ f (-32768) `Hspec.shouldBe` (-32768)-- Hspec.describe "From Int16 Int64" $ do- let f = Witch.from @Int.Int16 @Int.Int64- test $ f 0 `Hspec.shouldBe` 0- test $ f 32767 `Hspec.shouldBe` 32767- test $ f (-32768) `Hspec.shouldBe` (-32768)-- Hspec.describe "From Int16 Int" $ do- let f = Witch.from @Int.Int16 @Int- test $ f 0 `Hspec.shouldBe` 0- test $ f 32767 `Hspec.shouldBe` 32767- test $ f (-32768) `Hspec.shouldBe` (-32768)-- Hspec.describe "From Int16 Integer" $ do- let f = Witch.from @Int.Int16 @Integer- test $ f 0 `Hspec.shouldBe` 0- test $ f 32767 `Hspec.shouldBe` 32767- test $ f (-32768) `Hspec.shouldBe` (-32768)-- Hspec.describe "TryFrom Int16 Word8" $ do- let f = hush . Witch.tryFrom @Int.Int16 @Word.Word8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 255 `Hspec.shouldBe` Just 255- test $ f 256 `Hspec.shouldBe` Nothing- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int16 Word16" $ do- let f = hush . Witch.tryFrom @Int.Int16 @Word.Word16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 127 `Hspec.shouldBe` Just 127- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int16 Word32" $ do- let f = hush . Witch.tryFrom @Int.Int16 @Word.Word32- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 32767 `Hspec.shouldBe` Just 32767- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int16 Word64" $ do- let f = hush . Witch.tryFrom @Int.Int16 @Word.Word64- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 32767 `Hspec.shouldBe` Just 32767- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int16 Word" $ do- let f = hush . Witch.tryFrom @Int.Int16 @Word- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 32767 `Hspec.shouldBe` Just 32767- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int16 Natural" $ do- let f = hush . Witch.tryFrom @Int.Int16 @Natural.Natural- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 32767 `Hspec.shouldBe` Just 32767- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "From Int16 Float" $ do- let f = Witch.from @Int.Int16 @Float- test $ f 0 `Hspec.shouldBe` 0- test $ f 32767 `Hspec.shouldBe` 32767- test $ f (-32768) `Hspec.shouldBe` (-32768)-- Hspec.describe "From Int16 Double" $ do- let f = Witch.from @Int.Int16 @Double- test $ f 0 `Hspec.shouldBe` 0- test $ f 32767 `Hspec.shouldBe` 32767- test $ f (-32768) `Hspec.shouldBe` (-32768)-- -- Int32-- Hspec.describe "TryFrom Int32 Int8" $ do- let f = hush . Witch.tryFrom @Int.Int32 @Int.Int8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 127 `Hspec.shouldBe` Just 127- test $ f 128 `Hspec.shouldBe` Nothing- test $ f (-128) `Hspec.shouldBe` Just (-128)- test $ f (-129) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int32 Int16" $ do- let f = hush . Witch.tryFrom @Int.Int32 @Int.Int16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 32767 `Hspec.shouldBe` Just 32767- test $ f 32768 `Hspec.shouldBe` Nothing- test $ f (-32768) `Hspec.shouldBe` Just (-32768)- test $ f (-32769) `Hspec.shouldBe` Nothing-- Hspec.describe "From Int32 Int64" $ do- let f = Witch.from @Int.Int32 @Int.Int64- test $ f 0 `Hspec.shouldBe` 0- test $ f 2147483647 `Hspec.shouldBe` 2147483647- test $ f (-2147483648) `Hspec.shouldBe` (-2147483648)-- Hspec.describe "TryFrom Int32 Int" $ do- Monad.when (toInteger (maxBound :: Int) < 2147483647) untested- let f = hush . Witch.tryFrom @Int.Int32 @Int- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 2147483647 `Hspec.shouldBe` Just 2147483647- test $ f (-2147483648) `Hspec.shouldBe` Just (-2147483648)-- Hspec.describe "From Int32 Integer" $ do- let f = Witch.from @Int.Int32 @Integer- test $ f 0 `Hspec.shouldBe` 0- test $ f 2147483647 `Hspec.shouldBe` 2147483647- test $ f (-2147483648) `Hspec.shouldBe` (-2147483648)-- Hspec.describe "TryFrom Int32 Word8" $ do- let f = hush . Witch.tryFrom @Int.Int32 @Word.Word8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 255 `Hspec.shouldBe` Just 255- test $ f 256 `Hspec.shouldBe` Nothing- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int32 Word16" $ do- let f = hush . Witch.tryFrom @Int.Int32 @Word.Word16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 65535 `Hspec.shouldBe` Just 65535- test $ f 65536 `Hspec.shouldBe` Nothing- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int32 Word32" $ do- let f = hush . Witch.tryFrom @Int.Int32 @Word.Word32- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 2147483647 `Hspec.shouldBe` Just 2147483647- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int32 Word64" $ do- let f = hush . Witch.tryFrom @Int.Int32 @Word.Word64- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 2147483647 `Hspec.shouldBe` Just 2147483647- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int32 Word" $ do- Monad.when (toInteger (maxBound :: Word) < 2147483647) untested- let f = hush . Witch.tryFrom @Int.Int32 @Word- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 2147483647 `Hspec.shouldBe` Just 2147483647- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int32 Natural" $ do- let f = hush . Witch.tryFrom @Int.Int32 @Natural.Natural- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 2147483647 `Hspec.shouldBe` Just 2147483647- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int32 Float" $ do- let f = hush . Witch.tryFrom @Int.Int32 @Float- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 16777215 `Hspec.shouldBe` Just 16777215- test $ f 16777216 `Hspec.shouldBe` Nothing- test $ f (-16777215) `Hspec.shouldBe` Just (-16777215)- test $ f (-16777216) `Hspec.shouldBe` Nothing-- Hspec.describe "From Int32 Double" $ do- let f = Witch.from @Int.Int32 @Double- test $ f 0 `Hspec.shouldBe` 0- test $ f 2147483647 `Hspec.shouldBe` 2147483647- test $ f (-2147483648) `Hspec.shouldBe` (-2147483648)-- -- Int64-- Hspec.describe "TryFrom Int64 Int8" $ do- let f = hush . Witch.tryFrom @Int.Int64 @Int.Int8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 127 `Hspec.shouldBe` Just 127- test $ f 128 `Hspec.shouldBe` Nothing- test $ f (-128) `Hspec.shouldBe` Just (-128)- test $ f (-129) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int64 Int16" $ do- let f = hush . Witch.tryFrom @Int.Int64 @Int.Int16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 32767 `Hspec.shouldBe` Just 32767- test $ f 32768 `Hspec.shouldBe` Nothing- test $ f (-32768) `Hspec.shouldBe` Just (-32768)- test $ f (-32769) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int64 Int32" $ do- let f = hush . Witch.tryFrom @Int.Int64 @Int.Int32- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 2147483647 `Hspec.shouldBe` Just 2147483647- test $ f 2147483648 `Hspec.shouldBe` Nothing- test $ f (-2147483648) `Hspec.shouldBe` Just (-2147483648)- test $ f (-2147483649) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int64 Int" $ do- Monad.when (toInteger (maxBound :: Int) < 9223372036854775807) untested- let f = hush . Witch.tryFrom @Int.Int64 @Int- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 9223372036854775807 `Hspec.shouldBe` Just 9223372036854775807- test $ f (-9223372036854775808) `Hspec.shouldBe` Just (-9223372036854775808)-- Hspec.describe "From Int64 Integer" $ do- let f = Witch.from @Int.Int64 @Integer- test $ f 0 `Hspec.shouldBe` 0- test $ f 9223372036854775807 `Hspec.shouldBe` 9223372036854775807- test $ f (-9223372036854775808) `Hspec.shouldBe` (-9223372036854775808)-- Hspec.describe "TryFrom Int64 Word8" $ do- let f = hush . Witch.tryFrom @Int.Int64 @Word.Word8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 255 `Hspec.shouldBe` Just 255- test $ f 256 `Hspec.shouldBe` Nothing- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int64 Word16" $ do- let f = hush . Witch.tryFrom @Int.Int64 @Word.Word16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 65535 `Hspec.shouldBe` Just 65535- test $ f 65536 `Hspec.shouldBe` Nothing- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int64 Word32" $ do- let f = hush . Witch.tryFrom @Int.Int64 @Word.Word32- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 2147483647 `Hspec.shouldBe` Just 2147483647- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int64 Word64" $ do- let f = hush . Witch.tryFrom @Int.Int64 @Word.Word64- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 9223372036854775807 `Hspec.shouldBe` Just 9223372036854775807- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int64 Word" $ do- Monad.when (toInteger (maxBound :: Word) < 9223372036854775807) untested- let f = hush . Witch.tryFrom @Int.Int64 @Word- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 9223372036854775807 `Hspec.shouldBe` Just 9223372036854775807- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int64 Natural" $ do- let f = hush . Witch.tryFrom @Int.Int64 @Natural.Natural- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 9223372036854775807 `Hspec.shouldBe` Just 9223372036854775807- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int64 Float" $ do- let f = hush . Witch.tryFrom @Int.Int64 @Float- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 16777215 `Hspec.shouldBe` Just 16777215- test $ f 16777216 `Hspec.shouldBe` Nothing- test $ f (-16777215) `Hspec.shouldBe` Just (-16777215)- test $ f (-16777216) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int64 Double" $ do- let f = hush . Witch.tryFrom @Int.Int64 @Double- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 9007199254740991 `Hspec.shouldBe` Just 9007199254740991- test $ f 9007199254740992 `Hspec.shouldBe` Nothing- test $ f (-9007199254740991) `Hspec.shouldBe` Just (-9007199254740991)- test $ f (-9007199254740992) `Hspec.shouldBe` Nothing-- -- Int-- Hspec.describe "TryFrom Int Int8" $ do- let f = hush . Witch.tryFrom @Int @Int.Int8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 127 `Hspec.shouldBe` Just 127- test $ f 128 `Hspec.shouldBe` Nothing- test $ f (-128) `Hspec.shouldBe` Just (-128)- test $ f (-129) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int Int16" $ do- let f = hush . Witch.tryFrom @Int @Int.Int16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 32767 `Hspec.shouldBe` Just 32767- test $ f 32768 `Hspec.shouldBe` Nothing- test $ f (-32768) `Hspec.shouldBe` Just (-32768)- test $ f (-32769) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int Int32" $ do- Monad.when (toInteger (maxBound :: Int) < 2147483647) untested- let f = hush . Witch.tryFrom @Int @Int.Int32- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 2147483647 `Hspec.shouldBe` Just 2147483647- test $ f 2147483648 `Hspec.shouldBe` Nothing- test $ f (-2147483648) `Hspec.shouldBe` Just (-2147483648)- test $ f (-2147483649) `Hspec.shouldBe` Nothing-- Hspec.describe "From Int Int64" $ do- let f = Witch.from @Int @Int.Int64- test $ f 0 `Hspec.shouldBe` 0- test $ f maxBound `Hspec.shouldBe` fromIntegral (maxBound :: Int)- test $ f minBound `Hspec.shouldBe` fromIntegral (minBound :: Int)-- Hspec.describe "From Int Integer" $ do- let f = Witch.from @Int @Integer- test $ f 0 `Hspec.shouldBe` 0- test $ f maxBound `Hspec.shouldBe` fromIntegral (maxBound :: Int)- test $ f minBound `Hspec.shouldBe` fromIntegral (minBound :: Int)-- Hspec.describe "TryFrom Int Word8" $ do- let f = hush . Witch.tryFrom @Int @Word.Word8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 255 `Hspec.shouldBe` Just 255- test $ f 256 `Hspec.shouldBe` Nothing- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int Word16" $ do- let f = hush . Witch.tryFrom @Int @Word.Word16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 65535 `Hspec.shouldBe` Just 65535- test $ f 65536 `Hspec.shouldBe` Nothing- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int Word32" $ do- Monad.when (toInteger (maxBound :: Int) < 4294967295) untested- let f = hush . Witch.tryFrom @Int @Word.Word32- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 4294967295 `Hspec.shouldBe` Just 4294967295- test $ f 4294967296 `Hspec.shouldBe` Nothing- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int Word64" $ do- let f = hush . Witch.tryFrom @Int @Word.Word64- test $ f 0 `Hspec.shouldBe` Just 0- test $ f maxBound `Hspec.shouldBe` Just (fromIntegral (maxBound :: Int))- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int Word" $ do- let f = hush . Witch.tryFrom @Int @Word- test $ f 0 `Hspec.shouldBe` Just 0- test $ f maxBound `Hspec.shouldBe` Just (fromIntegral (maxBound :: Int))- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int Natural" $ do- let f = hush . Witch.tryFrom @Int @Natural.Natural- test $ f 0 `Hspec.shouldBe` Just 0- test $ f maxBound `Hspec.shouldBe` Just (fromIntegral (maxBound :: Int))- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int Float" $ do- let f = hush . Witch.tryFrom @Int @Float- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 16777215 `Hspec.shouldBe` Just 16777215- test $ f 16777216 `Hspec.shouldBe` Nothing- test $ f (-16777215) `Hspec.shouldBe` Just (-16777215)- test $ f (-16777216) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Int Double" $ do- Monad.when (toInteger (maxBound :: Int) < 9007199254740991) untested- let f = hush . Witch.tryFrom @Int @Double- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 9007199254740991 `Hspec.shouldBe` Just 9007199254740991- test $ f 9007199254740992 `Hspec.shouldBe` Nothing- test $ f (-9007199254740991) `Hspec.shouldBe` Just (-9007199254740991)- test $ f (-9007199254740992) `Hspec.shouldBe` Nothing-- -- Integer-- Hspec.describe "TryFrom Integer Int8" $ do- let f = hush . Witch.tryFrom @Integer @Int.Int8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 127 `Hspec.shouldBe` Just 127- test $ f 128 `Hspec.shouldBe` Nothing- test $ f (-128) `Hspec.shouldBe` Just (-128)- test $ f (-129) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Integer Int16" $ do- let f = hush . Witch.tryFrom @Integer @Int.Int16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 32767 `Hspec.shouldBe` Just 32767- test $ f 32768 `Hspec.shouldBe` Nothing- test $ f (-32768) `Hspec.shouldBe` Just (-32768)- test $ f (-32769) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Integer Int32" $ do- let f = hush . Witch.tryFrom @Integer @Int.Int32- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 2147483647 `Hspec.shouldBe` Just 2147483647- test $ f 2147483648 `Hspec.shouldBe` Nothing- test $ f (-2147483648) `Hspec.shouldBe` Just (-2147483648)- test $ f (-2147483649) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Integer Int64" $ do- let f = hush . Witch.tryFrom @Integer @Int.Int64- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 9223372036854775807 `Hspec.shouldBe` Just 9223372036854775807- test $ f 9223372036854775808 `Hspec.shouldBe` Nothing- test $ f (-9223372036854775808) `Hspec.shouldBe` Just (-9223372036854775808)- test $ f (-9223372036854775809) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Integer Int" $ do- let f = hush . Witch.tryFrom @Integer @Int- test $ f 0 `Hspec.shouldBe` Just 0- test $ let x = maxBound :: Int in f (fromIntegral x) `Hspec.shouldBe` Just x- test $ let x = toInteger (maxBound :: Int) + 1 in f x `Hspec.shouldBe` Nothing- test $ let x = minBound :: Int in f (fromIntegral x) `Hspec.shouldBe` Just x- test $ let x = toInteger (minBound :: Int) - 1 in f x `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Integer Word8" $ do- let f = hush . Witch.tryFrom @Integer @Word.Word8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 255 `Hspec.shouldBe` Just 255- test $ f 256 `Hspec.shouldBe` Nothing- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Integer Word16" $ do- let f = hush . Witch.tryFrom @Integer @Word.Word16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 65535 `Hspec.shouldBe` Just 65535- test $ f 65536 `Hspec.shouldBe` Nothing- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Integer Word32" $ do- let f = hush . Witch.tryFrom @Integer @Word.Word32- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 4294967295 `Hspec.shouldBe` Just 4294967295- test $ f 4294967296 `Hspec.shouldBe` Nothing- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Integer Word64" $ do- let f = hush . Witch.tryFrom @Integer @Word.Word64- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 18446744073709551615 `Hspec.shouldBe` Just 18446744073709551615- test $ f 18446744073709551616 `Hspec.shouldBe` Nothing- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Integer Word" $ do- let f = hush . Witch.tryFrom @Integer @Word- test $ f 0 `Hspec.shouldBe` Just 0- test $ let x = maxBound :: Word in f (fromIntegral x) `Hspec.shouldBe` Just x- test $ let x = toInteger (maxBound :: Word) + 1 in f x `Hspec.shouldBe` Nothing- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Integer Natural" $ do- let f = hush . Witch.tryFrom @Integer @Natural.Natural- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 18446744073709551616 `Hspec.shouldBe` Just 18446744073709551616- test $ f (-1) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Integer Float" $ do- let f = hush . Witch.tryFrom @Integer @Float- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 16777215 `Hspec.shouldBe` Just 16777215- test $ f 16777216 `Hspec.shouldBe` Nothing- test $ f (-16777215) `Hspec.shouldBe` Just (-16777215)- test $ f (-16777216) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Integer Double" $ do- let f = hush . Witch.tryFrom @Integer @Double- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 9007199254740991 `Hspec.shouldBe` Just 9007199254740991- test $ f 9007199254740992 `Hspec.shouldBe` Nothing- test $ f (-9007199254740991) `Hspec.shouldBe` Just (-9007199254740991)- test $ f (-9007199254740992) `Hspec.shouldBe` Nothing-- -- Word8-- Hspec.describe "From Word8 Word16" $ do- let f = Witch.from @Word.Word8 @Word.Word16- test $ f 0 `Hspec.shouldBe` 0- test $ f 255 `Hspec.shouldBe` 255-- Hspec.describe "From Word8 Word32" $ do- let f = Witch.from @Word.Word8 @Word.Word32- test $ f 0 `Hspec.shouldBe` 0- test $ f 255 `Hspec.shouldBe` 255-- Hspec.describe "From Word8 Word64" $ do- let f = Witch.from @Word.Word8 @Word.Word64- test $ f 0 `Hspec.shouldBe` 0- test $ f 255 `Hspec.shouldBe` 255-- Hspec.describe "From Word8 Word" $ do- let f = Witch.from @Word.Word8 @Word- test $ f 0 `Hspec.shouldBe` 0- test $ f 255 `Hspec.shouldBe` 255-- Hspec.describe "From Word8 Natural" $ do- let f = Witch.from @Word.Word8 @Natural.Natural- test $ f 0 `Hspec.shouldBe` 0- test $ f 255 `Hspec.shouldBe` 255-- Hspec.describe "TryFrom Word8 Int8" $ do- let f = hush . Witch.tryFrom @Word.Word8 @Int.Int8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 127 `Hspec.shouldBe` Just 127- test $ f 128 `Hspec.shouldBe` Nothing-- Hspec.describe "From Word8 Int16" $ do- let f = Witch.from @Word.Word8 @Int.Int16- test $ f 0 `Hspec.shouldBe` 0- test $ f 255 `Hspec.shouldBe` 255-- Hspec.describe "From Word8 Int32" $ do- let f = Witch.from @Word.Word8 @Int.Int32- test $ f 0 `Hspec.shouldBe` 0- test $ f 255 `Hspec.shouldBe` 255-- Hspec.describe "From Word8 Int64" $ do- let f = Witch.from @Word.Word8 @Int.Int64- test $ f 0 `Hspec.shouldBe` 0- test $ f 255 `Hspec.shouldBe` 255-- Hspec.describe "From Word8 Int" $ do- let f = Witch.from @Word.Word8 @Int- test $ f 0 `Hspec.shouldBe` 0- test $ f 255 `Hspec.shouldBe` 255-- Hspec.describe "From Word8 Integer" $ do- let f = Witch.from @Word.Word8 @Integer- test $ f 0 `Hspec.shouldBe` 0- test $ f 255 `Hspec.shouldBe` 255-- Hspec.describe "From Word8 Float" $ do- let f = Witch.from @Word.Word8 @Float- test $ f 0 `Hspec.shouldBe` 0- test $ f 255 `Hspec.shouldBe` 255-- Hspec.describe "From Word8 Double" $ do- let f = Witch.from @Word.Word8 @Double- test $ f 0 `Hspec.shouldBe` 0- test $ f 255 `Hspec.shouldBe` 255-- -- Word16-- Hspec.describe "TryFrom Word16 Word8" $ do- let f = hush . Witch.tryFrom @Word.Word16 @Word.Word8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 255 `Hspec.shouldBe` Just 255- test $ f 256 `Hspec.shouldBe` Nothing-- Hspec.describe "From Word16 Word32" $ do- let f = Witch.from @Word.Word16 @Word.Word32- test $ f 0 `Hspec.shouldBe` 0- test $ f 65535 `Hspec.shouldBe` 65535-- Hspec.describe "From Word16 Word64" $ do- let f = Witch.from @Word.Word16 @Word.Word64- test $ f 0 `Hspec.shouldBe` 0- test $ f 65535 `Hspec.shouldBe` 65535-- Hspec.describe "From Word16 Word" $ do- let f = Witch.from @Word.Word16 @Word- test $ f 0 `Hspec.shouldBe` 0- test $ f 65535 `Hspec.shouldBe` 65535-- Hspec.describe "From Word16 Natural" $ do- let f = Witch.from @Word.Word16 @Natural.Natural- test $ f 0 `Hspec.shouldBe` 0- test $ f 65535 `Hspec.shouldBe` 65535-- Hspec.describe "TryFrom Word16 Int8" $ do- let f = hush . Witch.tryFrom @Word.Word16 @Int.Int8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 127 `Hspec.shouldBe` Just 127- test $ f 128 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Word16 Int16" $ do- let f = hush . Witch.tryFrom @Word.Word16 @Int.Int16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 32767 `Hspec.shouldBe` Just 32767- test $ f 32768 `Hspec.shouldBe` Nothing-- Hspec.describe "From Word16 Int32" $ do- let f = Witch.from @Word.Word16 @Int.Int32- test $ f 0 `Hspec.shouldBe` 0- test $ f 65535 `Hspec.shouldBe` 65535-- Hspec.describe "From Word16 Int64" $ do- let f = Witch.from @Word.Word16 @Int.Int64- test $ f 0 `Hspec.shouldBe` 0- test $ f 65535 `Hspec.shouldBe` 65535-- Hspec.describe "From Word16 Int" $ do- let f = Witch.from @Word.Word16 @Int- test $ f 0 `Hspec.shouldBe` 0- test $ f 65535 `Hspec.shouldBe` 65535-- Hspec.describe "From Word16 Integer" $ do- let f = Witch.from @Word.Word16 @Integer- test $ f 0 `Hspec.shouldBe` 0- test $ f 65535 `Hspec.shouldBe` 65535-- Hspec.describe "From Word16 Float" $ do- let f = Witch.from @Word.Word16 @Float- test $ f 0 `Hspec.shouldBe` 0- test $ f 65535 `Hspec.shouldBe` 65535-- Hspec.describe "From Word16 Double" $ do- let f = Witch.from @Word.Word16 @Double- test $ f 0 `Hspec.shouldBe` 0- test $ f 65535 `Hspec.shouldBe` 65535-- -- Word32-- Hspec.describe "TryFrom Word32 Word8" $ do- let f = hush . Witch.tryFrom @Word.Word32 @Word.Word8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 255 `Hspec.shouldBe` Just 255- test $ f 256 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Word32 Word16" $ do- let f = hush . Witch.tryFrom @Word.Word32 @Word.Word16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 65535 `Hspec.shouldBe` Just 65535- test $ f 65536 `Hspec.shouldBe` Nothing-- Hspec.describe "From Word32 Word64" $ do- let f = Witch.from @Word.Word32 @Word.Word64- test $ f 0 `Hspec.shouldBe` 0- test $ f 4294967295 `Hspec.shouldBe` 4294967295-- Hspec.describe "TryFrom Word32 Word" $ do- Monad.when (toInteger (maxBound :: Word) < 4294967295) untested- let f = hush . Witch.tryFrom @Word.Word32 @Word- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 4294967295 `Hspec.shouldBe` Just 4294967295-- Hspec.describe "From Word32 Natural" $ do- let f = Witch.from @Word.Word32 @Natural.Natural- test $ f 0 `Hspec.shouldBe` 0- test $ f 4294967295 `Hspec.shouldBe` 4294967295-- Hspec.describe "TryFrom Word32 Int8" $ do- let f = hush . Witch.tryFrom @Word.Word32 @Int.Int8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 127 `Hspec.shouldBe` Just 127- test $ f 128 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Word32 Int16" $ do- let f = hush . Witch.tryFrom @Word.Word32 @Int.Int16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 32767 `Hspec.shouldBe` Just 32767- test $ f 32768 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Word32 Int32" $ do- let f = hush . Witch.tryFrom @Word.Word32 @Int.Int32- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 2147483647 `Hspec.shouldBe` Just 2147483647- test $ f 2147483648 `Hspec.shouldBe` Nothing-- Hspec.describe "From Word32 Int64" $ do- let f = Witch.from @Word.Word32 @Int.Int64- test $ f 0 `Hspec.shouldBe` 0- test $ f 4294967295 `Hspec.shouldBe` 4294967295-- Hspec.describe "TryFrom Word32 Int" $ do- Monad.when (toInteger (maxBound :: Int) < 4294967295) untested- let f = hush . Witch.tryFrom @Word.Word32 @Int- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 4294967295 `Hspec.shouldBe` Just 4294967295-- Hspec.describe "From Word32 Integer" $ do- let f = Witch.from @Word.Word32 @Integer- test $ f 0 `Hspec.shouldBe` 0- test $ f 4294967295 `Hspec.shouldBe` 4294967295-- Hspec.describe "TryFrom Word32 Float" $ do- let f = hush . Witch.tryFrom @Word.Word32 @Float- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 16777215 `Hspec.shouldBe` Just 16777215- test $ f 16777216 `Hspec.shouldBe` Nothing-- Hspec.describe "From Word32 Double" $ do- let f = Witch.from @Word.Word32 @Double- test $ f 0 `Hspec.shouldBe` 0- test $ f 4294967295 `Hspec.shouldBe` 4294967295-- -- Word64-- Hspec.describe "TryFrom Word64 Word8" $ do- let f = hush . Witch.tryFrom @Word.Word64 @Word.Word8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 255 `Hspec.shouldBe` Just 255- test $ f 256 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Word64 Word16" $ do- let f = hush . Witch.tryFrom @Word.Word64 @Word.Word16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 65535 `Hspec.shouldBe` Just 65535- test $ f 65536 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Word64 Word32" $ do- let f = hush . Witch.tryFrom @Word.Word64 @Word.Word32- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 4294967295 `Hspec.shouldBe` Just 4294967295- test $ f 4294967296 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Word64 Word" $ do- Monad.when (toInteger (maxBound :: Word) < 18446744073709551615) untested- let f = hush . Witch.tryFrom @Word.Word64 @Word- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 18446744073709551615 `Hspec.shouldBe` Just 18446744073709551615-- Hspec.describe "From Word64 Natural" $ do- let f = Witch.from @Word.Word64 @Natural.Natural- test $ f 0 `Hspec.shouldBe` 0- test $ f 18446744073709551615 `Hspec.shouldBe` 18446744073709551615-- Hspec.describe "TryFrom Word64 Int8" $ do- let f = hush . Witch.tryFrom @Word.Word64 @Int.Int8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 127 `Hspec.shouldBe` Just 127- test $ f 128 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Word64 Int16" $ do- let f = hush . Witch.tryFrom @Word.Word64 @Int.Int16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 32767 `Hspec.shouldBe` Just 32767- test $ f 32768 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Word64 Int32" $ do- let f = hush . Witch.tryFrom @Word.Word64 @Int.Int32- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 2147483647 `Hspec.shouldBe` Just 2147483647- test $ f 2147483648 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Word64 Int64" $ do- let f = hush . Witch.tryFrom @Word.Word64 @Int.Int64- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 9223372036854775807 `Hspec.shouldBe` Just 9223372036854775807- test $ f 9223372036854775808 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Word64 Int" $ do- let f = hush . Witch.tryFrom @Word.Word64 @Int- test $ f 0 `Hspec.shouldBe` Just 0- test $ let x = maxBound :: Int in hush (Witch.tryFrom @Word.Word64 @Int (fromIntegral x)) `Hspec.shouldBe` Just x- test $ let x = fromIntegral (maxBound :: Int) + 1 :: Word.Word64 in hush (Witch.tryFrom @Word.Word64 @Int x) `Hspec.shouldBe` Nothing-- Hspec.describe "From Word64 Integer" $ do- let f = Witch.from @Word.Word64 @Integer- test $ f 0 `Hspec.shouldBe` 0- test $ f 18446744073709551615 `Hspec.shouldBe` 18446744073709551615-- Hspec.describe "TryFrom Word64 Float" $ do- let f = hush . Witch.tryFrom @Word.Word64 @Float- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 16777215 `Hspec.shouldBe` Just 16777215- test $ f 16777216 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Word64 Double" $ do- let f = hush . Witch.tryFrom @Word.Word64 @Double- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 9007199254740991 `Hspec.shouldBe` Just 9007199254740991- test $ f 9007199254740992 `Hspec.shouldBe` Nothing-- -- Word-- Hspec.describe "TryFrom Word Word8" $ do- let f = hush . Witch.tryFrom @Word @Word.Word8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 255 `Hspec.shouldBe` Just 255- test $ f 256 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Word Word16" $ do- let f = hush . Witch.tryFrom @Word @Word.Word16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 65535 `Hspec.shouldBe` Just 65535- test $ f 65536 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Word Word32" $ do- Monad.when (toInteger (maxBound :: Word) < 4294967295) untested- let f = hush . Witch.tryFrom @Word @Word.Word32- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 4294967295 `Hspec.shouldBe` Just 4294967295- test $ f 4294967296 `Hspec.shouldBe` Nothing-- Hspec.describe "From Word Word64" $ do- let f = Witch.from @Word @Word.Word64- test $ f 0 `Hspec.shouldBe` 0- test $ f maxBound `Hspec.shouldBe` fromIntegral (maxBound :: Word)-- Hspec.describe "From Word Natural" $ do- let f = Witch.from @Word @Natural.Natural- test $ f 0 `Hspec.shouldBe` 0- test $ f maxBound `Hspec.shouldBe` fromIntegral (maxBound :: Word)-- Hspec.describe "TryFrom Word Int8" $ do- let f = hush . Witch.tryFrom @Word @Int.Int8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 127 `Hspec.shouldBe` Just 127- test $ f 128 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Word Int16" $ do- let f = hush . Witch.tryFrom @Word @Int.Int16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 32767 `Hspec.shouldBe` Just 32767- test $ f 32768 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Word Int32" $ do- Monad.when (toInteger (maxBound :: Word) < 2147483647) untested- let f = hush . Witch.tryFrom @Word @Int.Int32- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 2147483647 `Hspec.shouldBe` Just 2147483647- test $ f 2147483648 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Word Int64" $ do- Monad.when (toInteger (maxBound :: Word) < 9223372036854775807) untested- let f = hush . Witch.tryFrom @Word @Int.Int64- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 9223372036854775807 `Hspec.shouldBe` Just 9223372036854775807- test $ f 9223372036854775808 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Word Int" $ do- let f = hush . Witch.tryFrom @Word @Int- test $ f 0 `Hspec.shouldBe` Just 0- test $ let x = maxBound :: Int in hush (Witch.tryFrom @Word @Int (fromIntegral x)) `Hspec.shouldBe` Just x- test $ let x = fromIntegral (maxBound :: Int) + 1 :: Word in hush (Witch.tryFrom @Word @Int x) `Hspec.shouldBe` Nothing-- Hspec.describe "From Word Integer" $ do- let f = Witch.from @Word @Integer- test $ f 0 `Hspec.shouldBe` 0- test $ f maxBound `Hspec.shouldBe` fromIntegral (maxBound :: Word)-- Hspec.describe "TryFrom Word Float" $ do- let f = hush . Witch.tryFrom @Word @Float- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 16777215 `Hspec.shouldBe` Just 16777215- test $ f 16777216 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Word Double" $ do- Monad.when (toInteger (maxBound :: Word) < 9007199254740991) untested- let f = hush . Witch.tryFrom @Word @Double- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 9007199254740991 `Hspec.shouldBe` Just 9007199254740991- test $ f 9007199254740992 `Hspec.shouldBe` Nothing-- -- Natural-- Hspec.describe "TryFrom Natural Word8" $ do- let f = hush . Witch.tryFrom @Natural.Natural @Word.Word8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 255 `Hspec.shouldBe` Just 255- test $ f 256 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Natural Word16" $ do- let f = hush . Witch.tryFrom @Natural.Natural @Word.Word16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 65535 `Hspec.shouldBe` Just 65535- test $ f 65536 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Natural Word32" $ do- let f = hush . Witch.tryFrom @Natural.Natural @Word.Word32- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 4294967295 `Hspec.shouldBe` Just 4294967295- test $ f 4294967296 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Natural Word64" $ do- let f = hush . Witch.tryFrom @Natural.Natural @Word.Word64- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 18446744073709551615 `Hspec.shouldBe` Just 18446744073709551615- test $ f 18446744073709551616 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Natural Word" $ do- let f = hush . Witch.tryFrom @Natural.Natural @Word- test $ f 0 `Hspec.shouldBe` Just 0- test $ let x = maxBound :: Word in hush (Witch.tryFrom @Natural.Natural @Word (fromIntegral x)) `Hspec.shouldBe` Just x- test $ let x = fromIntegral (maxBound :: Word) + 1 :: Natural.Natural in hush (Witch.tryFrom @Natural.Natural @Word x) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Natural Int8" $ do- let f = hush . Witch.tryFrom @Natural.Natural @Int.Int8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 127 `Hspec.shouldBe` Just 127- test $ f 128 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Natural Int16" $ do- let f = hush . Witch.tryFrom @Natural.Natural @Int.Int16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 32767 `Hspec.shouldBe` Just 32767- test $ f 32768 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Natural Int32" $ do- let f = hush . Witch.tryFrom @Natural.Natural @Int.Int32- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 2147483647 `Hspec.shouldBe` Just 2147483647- test $ f 2147483648 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Natural Int64" $ do- let f = hush . Witch.tryFrom @Natural.Natural @Int.Int64- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 9223372036854775807 `Hspec.shouldBe` Just 9223372036854775807- test $ f 9223372036854775808 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Natural Int" $ do- let f = hush . Witch.tryFrom @Natural.Natural @Int- test $ f 0 `Hspec.shouldBe` Just 0- test $ let x = maxBound :: Int in hush (Witch.tryFrom @Natural.Natural @Int (fromIntegral x)) `Hspec.shouldBe` Just x- test $ let x = fromIntegral (maxBound :: Int) + 1 :: Natural.Natural in hush (Witch.tryFrom @Natural.Natural @Int x) `Hspec.shouldBe` Nothing-- Hspec.describe "From Natural Integer" $ do- let f = Witch.from @Natural.Natural @Integer- test $ f 0 `Hspec.shouldBe` 0- test $ f 9223372036854775808 `Hspec.shouldBe` 9223372036854775808-- Hspec.describe "TryFrom Natural Float" $ do- let f = hush . Witch.tryFrom @Natural.Natural @Float- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 16777215 `Hspec.shouldBe` Just 16777215- test $ f 16777216 `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Natural Double" $ do- let f = hush . Witch.tryFrom @Natural.Natural @Double- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 9007199254740991 `Hspec.shouldBe` Just 9007199254740991- test $ f 9007199254740992 `Hspec.shouldBe` Nothing-- -- Float-- Hspec.describe "TryFrom Float Int8" $ do- let f = hush . Witch.tryFrom @Float @Int.Int8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 127 `Hspec.shouldBe` Just 127- test $ f 128 `Hspec.shouldBe` Nothing- test $ f (-128) `Hspec.shouldBe` Just (-128)- test $ f (-129) `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Float Int16" $ do- let f = hush . Witch.tryFrom @Float @Int.Int16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 32767 `Hspec.shouldBe` Just 32767- test $ f 32768 `Hspec.shouldBe` Nothing- test $ f (-32768) `Hspec.shouldBe` Just (-32768)- test $ f (-32769) `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Float Int32" $ do- let f = hush . Witch.tryFrom @Float @Int.Int32- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 16777215 `Hspec.shouldBe` Just 16777215- test $ f 16777216 `Hspec.shouldBe` Nothing- test $ f (-16777215) `Hspec.shouldBe` Just (-16777215)- test $ f (-16777216) `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Float Int64" $ do- let f = hush . Witch.tryFrom @Float @Int.Int64- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 16777215 `Hspec.shouldBe` Just 16777215- test $ f 16777216 `Hspec.shouldBe` Nothing- test $ f (-16777215) `Hspec.shouldBe` Just (-16777215)- test $ f (-16777216) `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Float Int" $ do- let f = hush . Witch.tryFrom @Float @Int- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 16777215 `Hspec.shouldBe` Just 16777215- test $ f 16777216 `Hspec.shouldBe` Nothing- test $ f (-16777215) `Hspec.shouldBe` Just (-16777215)- test $ f (-16777216) `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Float Integer" $ do- let f = hush . Witch.tryFrom @Float @Integer- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 16777215 `Hspec.shouldBe` Just 16777215- test $ f 16777216 `Hspec.shouldBe` Nothing- test $ f (-16777215) `Hspec.shouldBe` Just (-16777215)- test $ f (-16777216) `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Float Word8" $ do- let f = hush . Witch.tryFrom @Float @Word.Word8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 255 `Hspec.shouldBe` Just 255- test $ f 256 `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Float Word16" $ do- let f = hush . Witch.tryFrom @Float @Word.Word16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 65535 `Hspec.shouldBe` Just 65535- test $ f 65536 `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Float Word32" $ do- let f = hush . Witch.tryFrom @Float @Word.Word32- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 16777215 `Hspec.shouldBe` Just 16777215- test $ f 16777216 `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Float Word64" $ do- let f = hush . Witch.tryFrom @Float @Word.Word64- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 16777215 `Hspec.shouldBe` Just 16777215- test $ f 16777216 `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Float Word" $ do- let f = hush . Witch.tryFrom @Float @Word- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 16777215 `Hspec.shouldBe` Just 16777215- test $ f 16777216 `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Float Natural" $ do- let f = hush . Witch.tryFrom @Float @Natural.Natural- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 16777215 `Hspec.shouldBe` Just 16777215- test $ f 16777216 `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Float Rational" $ do- let f = hush . Witch.tryFrom @Float @Rational- test $ f 0 `Hspec.shouldBe` Just 0- test $ f (-0) `Hspec.shouldBe` Just 0- test $ f 0.5 `Hspec.shouldBe` Just 0.5- test $ f (-0.5) `Hspec.shouldBe` Just (-0.5)- test $ f 16777215 `Hspec.shouldBe` Just 16777215- test $ f (-16777215) `Hspec.shouldBe` Just (-16777215)- test $ f 16777216 `Hspec.shouldBe` Just 16777216- test $ f (-16777216) `Hspec.shouldBe` Just (-16777216)- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "From Float Double" $ do- let f = Witch.from @Float @Double- test $ f 0 `Hspec.shouldBe` 0- test $ f 0.5 `Hspec.shouldBe` 0.5- test $ f (-0.5) `Hspec.shouldBe` (-0.5)- test $ f (0 / 0) `Hspec.shouldSatisfy` isNaN- test $ f (1 / 0) `Hspec.shouldBe` (1 / 0)- test $ f (-1 / 0) `Hspec.shouldBe` (-1 / 0)-- -- Double-- Hspec.describe "TryFrom Double Int8" $ do- let f = hush . Witch.tryFrom @Double @Int.Int8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 127 `Hspec.shouldBe` Just 127- test $ f 128 `Hspec.shouldBe` Nothing- test $ f (-128) `Hspec.shouldBe` Just (-128)- test $ f (-129) `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Double Int16" $ do- let f = hush . Witch.tryFrom @Double @Int.Int16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 32767 `Hspec.shouldBe` Just 32767- test $ f 32768 `Hspec.shouldBe` Nothing- test $ f (-32768) `Hspec.shouldBe` Just (-32768)- test $ f (-32769) `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Double Int32" $ do- let f = hush . Witch.tryFrom @Double @Int.Int32- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 2147483647 `Hspec.shouldBe` Just 2147483647- test $ f 2147483648 `Hspec.shouldBe` Nothing- test $ f (-2147483648) `Hspec.shouldBe` Just (-2147483648)- test $ f (-2147483649) `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Double Int64" $ do- let f = hush . Witch.tryFrom @Double @Int.Int64- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 9007199254740991 `Hspec.shouldBe` Just 9007199254740991- test $ f 9007199254740992 `Hspec.shouldBe` Nothing- test $ f (-9007199254740991) `Hspec.shouldBe` Just (-9007199254740991)- test $ f (-9007199254740992) `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Double Int" $ do- Monad.when (toInteger (maxBound :: Int) < 9007199254740991) untested- let f = hush . Witch.tryFrom @Double @Int- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 9007199254740991 `Hspec.shouldBe` Just 9007199254740991- test $ f 9007199254740992 `Hspec.shouldBe` Nothing- test $ f (-9007199254740991) `Hspec.shouldBe` Just (-9007199254740991)- test $ f (-9007199254740992) `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Double Integer" $ do- let f = hush . Witch.tryFrom @Double @Integer- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 9007199254740991 `Hspec.shouldBe` Just 9007199254740991- test $ f 9007199254740992 `Hspec.shouldBe` Nothing- test $ f (-9007199254740991) `Hspec.shouldBe` Just (-9007199254740991)- test $ f (-9007199254740992) `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Double Word8" $ do- let f = hush . Witch.tryFrom @Double @Word.Word8- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 255 `Hspec.shouldBe` Just 255- test $ f 256 `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Double Word16" $ do- let f = hush . Witch.tryFrom @Double @Word.Word16- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 65535 `Hspec.shouldBe` Just 65535- test $ f 65536 `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Double Word32" $ do- let f = hush . Witch.tryFrom @Double @Word.Word32- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 4294967295 `Hspec.shouldBe` Just 4294967295- test $ f 4294967296 `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Double Word64" $ do- let f = hush . Witch.tryFrom @Double @Word.Word64- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 9007199254740991 `Hspec.shouldBe` Just 9007199254740991- test $ f 9007199254740992 `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Double Word" $ do- Monad.when (toInteger (maxBound :: Word) < 9007199254740991) untested- let f = hush . Witch.tryFrom @Double @Word- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 9007199254740991 `Hspec.shouldBe` Just 9007199254740991- test $ f 9007199254740992 `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Double Natural" $ do- let f = hush . Witch.tryFrom @Double @Natural.Natural- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 9007199254740991 `Hspec.shouldBe` Just 9007199254740991- test $ f 9007199254740992 `Hspec.shouldBe` Nothing- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "TryFrom Double Rational" $ do- let f = hush . Witch.tryFrom @Double @Rational- test $ f 0 `Hspec.shouldBe` Just 0- test $ f (-0) `Hspec.shouldBe` Just 0- test $ f 0.5 `Hspec.shouldBe` Just 0.5- test $ f (-0.5) `Hspec.shouldBe` Just (-0.5)- test $ f 9007199254740991 `Hspec.shouldBe` Just 9007199254740991- test $ f (-9007199254740991) `Hspec.shouldBe` Just (-9007199254740991)- test $ f 9007199254740992 `Hspec.shouldBe` Just 9007199254740992- test $ f (-9007199254740992) `Hspec.shouldBe` Just (-9007199254740992)- test $ f (0 / 0) `Hspec.shouldBe` Nothing- test $ f (1 / 0) `Hspec.shouldBe` Nothing- test $ f (-1 / 0) `Hspec.shouldBe` Nothing-- Hspec.describe "From Double Float" $ do- let f = Witch.from @Double @Float- test $ f 0 `Hspec.shouldBe` 0- test $ f 0.5 `Hspec.shouldBe` 0.5- test $ f (-0.5) `Hspec.shouldBe` (-0.5)- test $ f (0 / 0) `Hspec.shouldSatisfy` isNaN- test $ f (1 / 0) `Hspec.shouldBe` (1 / 0)- test $ f (-1 / 0) `Hspec.shouldBe` (-1 / 0)-- -- Ratio-- Hspec.describe "From a (Ratio a)" $ do- test $ Witch.from @Integer @Rational 0 `Hspec.shouldBe` 0- let f = Witch.from @Int @(Ratio.Ratio Int)- test $ f 0 `Hspec.shouldBe` 0-- Hspec.describe "TryFrom (Ratio a) a" $ do- test $ hush (Witch.tryFrom @Rational @Integer 0) `Hspec.shouldBe` Just 0- test $ hush (Witch.tryFrom @Rational @Integer 0.5) `Hspec.shouldBe` Nothing- let f = hush . Witch.tryFrom @(Ratio.Ratio Int) @Int- test $ f 0 `Hspec.shouldBe` Just 0- test $ f 0.5 `Hspec.shouldBe` Nothing-- Hspec.describe "From Rational Float" $ do- let f = Witch.from @Rational @Float- test $ f 0 `Hspec.shouldBe` 0- test $ f 0.5 `Hspec.shouldBe` 0.5- test $ f (-0.5) `Hspec.shouldBe` (-0.5)-- Hspec.describe "From Rational Double" $ do- let f = Witch.from @Rational @Double- test $ f 0 `Hspec.shouldBe` 0- test $ f 0.5 `Hspec.shouldBe` 0.5- test $ f (-0.5) `Hspec.shouldBe` (-0.5)-- -- Fixed-- Hspec.describe "From Integer (Fixed a)" $ do- test $ Witch.from @Integer @Fixed.Uni 1 `Hspec.shouldBe` 1- let f = Witch.from @Integer @Fixed.Deci- test $ f 1 `Hspec.shouldBe` 0.1-- Hspec.describe "From (Fixed a) Integer" $ do- test $ Witch.from @Fixed.Uni @Integer 1 `Hspec.shouldBe` 1- let f = Witch.from @Fixed.Deci @Integer- test $ f 1 `Hspec.shouldBe` 10-- -- Complex-- Hspec.describe "From a (Complex a)" $ do- test $ Witch.from @Double @(Complex.Complex Double) 1 `Hspec.shouldBe` 1- let f = Witch.from @Float @(Complex.Complex Float)- test $ f 1 `Hspec.shouldBe` 1-- Hspec.describe "TryFrom (Complex a) a" $ do- test $ hush (Witch.tryFrom @(Complex.Complex Double) @Double 1) `Hspec.shouldBe` Just 1- test $ hush (Witch.tryFrom @(Complex.Complex Double) @Double (0 Complex.:+ 1)) `Hspec.shouldBe` Nothing- let f = hush . Witch.tryFrom @(Complex.Complex Float) @Float- test $ f 1 `Hspec.shouldBe` Just 1- test $ f (0 Complex.:+ 1) `Hspec.shouldBe` Nothing-- -- NonEmpty-- Hspec.describe "TryFrom [a] (NonEmpty a)" $ do- let f = hush . Witch.tryFrom @[Int] @(NonEmpty.NonEmpty Int)- test $ f [] `Hspec.shouldBe` Nothing- test $ f [1] `Hspec.shouldBe` Just (1 NonEmpty.:| [])- test $ f [1, 2] `Hspec.shouldBe` Just (1 NonEmpty.:| [2])-- Hspec.describe "From (NonEmpty a) [a]" $ do- let f = Witch.from @(NonEmpty.NonEmpty Int) @[Int]- test $ f (1 NonEmpty.:| []) `Hspec.shouldBe` [1]- test $ f (1 NonEmpty.:| [2]) `Hspec.shouldBe` [1, 2]-- -- Set-- Hspec.describe "From [a] (Set a)" $ do- let f = Witch.from @[Char] @(Set.Set Char)- test $ f [] `Hspec.shouldBe` Set.fromList []- test $ f ['a'] `Hspec.shouldBe` Set.fromList ['a']- test $ f ['a', 'b'] `Hspec.shouldBe` Set.fromList ['a', 'b']- test $ f ['a', 'a'] `Hspec.shouldBe` Set.fromList ['a']-- Hspec.describe "From (Set a) [a]" $ do- let f = Witch.from @(Set.Set Char) @[Char]- test $ f (Set.fromList []) `Hspec.shouldBe` []- test $ f (Set.fromList ['a']) `Hspec.shouldBe` ['a']- test $ f (Set.fromList ['a', 'b']) `Hspec.shouldBe` ['a', 'b']-- -- IntSet-- Hspec.describe "From [Int] IntSet" $ do- let f = Witch.from @[Int] @IntSet.IntSet- test $ f [] `Hspec.shouldBe` IntSet.fromList []- test $ f [1] `Hspec.shouldBe` IntSet.fromList [1]- test $ f [1, 2] `Hspec.shouldBe` IntSet.fromList [1, 2]-- Hspec.describe "From IntSet [Int]" $ do- let f = Witch.from @IntSet.IntSet @[Int]- test $ f (IntSet.fromList []) `Hspec.shouldBe` []- test $ f (IntSet.fromList [1]) `Hspec.shouldBe` [1]- test $ f (IntSet.fromList [1, 2]) `Hspec.shouldBe` [1, 2]-- -- Map-- Hspec.describe "From [(k, v)] (Map k v)" $ do- let f = Witch.from @[(Char, Int)] @(Map.Map Char Int)- test $ f [] `Hspec.shouldBe` Map.empty- test $ f [('a', 1)] `Hspec.shouldBe` Map.fromList [('a', 1)]- test $ f [('a', 1), ('b', 2)] `Hspec.shouldBe` Map.fromList [('a', 1), ('b', 2)]- test $ f [('a', 1), ('a', 2)] `Hspec.shouldBe` Map.fromList [('a', 2)]-- Hspec.describe "From (Map k v) [(k, v)]" $ do- let f = Witch.from @(Map.Map Char Int) @[(Char, Int)]- test $ f Map.empty `Hspec.shouldBe` []- test $ f (Map.fromList [('a', 1)]) `Hspec.shouldBe` [('a', 1)]- test $ f (Map.fromList [('a', 1), ('b', 2)]) `Hspec.shouldBe` [('a', 1), ('b', 2)]-- -- IntMap-- Hspec.describe "From [(Int, v)] (IntMap v)" $ do- let f = Witch.from @[(Int, Char)] @(IntMap.IntMap Char)- test $ f [] `Hspec.shouldBe` IntMap.fromList []- test $ f [(1, 'a')] `Hspec.shouldBe` IntMap.fromList [(1, 'a')]- test $ f [(1, 'a'), (2, 'b')] `Hspec.shouldBe` IntMap.fromList [(1, 'a'), (2, 'b')]- test $ f [(1, 'a'), (1, 'b')] `Hspec.shouldBe` IntMap.fromList [(1, 'b')]-- Hspec.describe "From (IntMap v) [(Int, v)]" $ do- let f = Witch.from @(IntMap.IntMap Char) @[(Int, Char)]- test $ f (IntMap.fromList []) `Hspec.shouldBe` []- test $ f (IntMap.fromList [(1, 'a')]) `Hspec.shouldBe` [(1, 'a')]- test $ f (IntMap.fromList [(1, 'a'), (2, 'b')]) `Hspec.shouldBe` [(1, 'a'), (2, 'b')]-- -- Seq-- Hspec.describe "From [a] (Seq a)" $ do- let f = Witch.from @[Int] @(Seq.Seq Int)- test $ f [] `Hspec.shouldBe` Seq.fromList []- test $ f [1] `Hspec.shouldBe` Seq.fromList [1]- test $ f [1, 2] `Hspec.shouldBe` Seq.fromList [1, 2]-- Hspec.describe "From (Seq a) [a]" $ do- let f = Witch.from @(Seq.Seq Int) @[Int]- test $ f (Seq.fromList []) `Hspec.shouldBe` []- test $ f (Seq.fromList [1]) `Hspec.shouldBe` [1]- test $ f (Seq.fromList [1, 2]) `Hspec.shouldBe` [1, 2]-- -- ByteString-- Hspec.describe "From [Word8] ByteString" $ do- let f = Witch.from @[Word.Word8] @ByteString.ByteString- test $ f [] `Hspec.shouldBe` ByteString.pack []- test $ f [0x00] `Hspec.shouldBe` ByteString.pack [0x00]- test $ f [0x0f, 0xf0] `Hspec.shouldBe` ByteString.pack [0x0f, 0xf0]-- Hspec.describe "From ByteString [Word8]" $ do- let f = Witch.from @ByteString.ByteString @[Word.Word8]- test $ f (ByteString.pack []) `Hspec.shouldBe` []- test $ f (ByteString.pack [0x00]) `Hspec.shouldBe` [0x00]- test $ f (ByteString.pack [0x0f, 0xf0]) `Hspec.shouldBe` [0x0f, 0xf0]-- Hspec.describe "From ByteString LazyByteString" $ do- let f = Witch.from @ByteString.ByteString @LazyByteString.ByteString- test $ f (ByteString.pack []) `Hspec.shouldBe` LazyByteString.pack []- test $ f (ByteString.pack [0x00]) `Hspec.shouldBe` LazyByteString.pack [0x00]- test $ f (ByteString.pack [0x0f, 0xf0]) `Hspec.shouldBe` LazyByteString.pack [0x0f, 0xf0]-- Hspec.describe "From ByteString ShortByteString" $ do- let f = Witch.from @ByteString.ByteString @ShortByteString.ShortByteString- test $ f (ByteString.pack []) `Hspec.shouldBe` ShortByteString.pack []- test $ f (ByteString.pack [0x00]) `Hspec.shouldBe` ShortByteString.pack [0x00]- test $ f (ByteString.pack [0x0f, 0xf0]) `Hspec.shouldBe` ShortByteString.pack [0x0f, 0xf0]-- Hspec.describe "TryFrom ByteString Text" $ do- let f = hush . Witch.tryFrom @ByteString.ByteString @Text.Text- test $ f (ByteString.pack []) `Hspec.shouldBe` Just (Text.pack "")- test $ f (ByteString.pack [0x61]) `Hspec.shouldBe` Just (Text.pack "a")- test $ f (ByteString.pack [0xff]) `Hspec.shouldBe` Nothing-- -- LazyByteString-- Hspec.describe "From [Word8] LazyByteString" $ do- let f = Witch.from @[Word.Word8] @LazyByteString.ByteString- test $ f [] `Hspec.shouldBe` LazyByteString.pack []- test $ f [0x00] `Hspec.shouldBe` LazyByteString.pack [0x00]- test $ f [0x0f, 0xf0] `Hspec.shouldBe` LazyByteString.pack [0x0f, 0xf0]-- Hspec.describe "From LazyByteString [Word8]" $ do- let f = Witch.from @LazyByteString.ByteString @[Word.Word8]- test $ f (LazyByteString.pack []) `Hspec.shouldBe` []- test $ f (LazyByteString.pack [0x00]) `Hspec.shouldBe` [0x00]- test $ f (LazyByteString.pack [0x0f, 0xf0]) `Hspec.shouldBe` [0x0f, 0xf0]-- Hspec.describe "From LazyByteString ByteString" $ do- let f = Witch.from @LazyByteString.ByteString @ByteString.ByteString- test $ f (LazyByteString.pack []) `Hspec.shouldBe` ByteString.pack []- test $ f (LazyByteString.pack [0x00]) `Hspec.shouldBe` ByteString.pack [0x00]- test $ f (LazyByteString.pack [0x0f, 0xf0]) `Hspec.shouldBe` ByteString.pack [0x0f, 0xf0]-- Hspec.describe "TryFrom LazyByteString LazyText" $ do- let f = hush . Witch.tryFrom @LazyByteString.ByteString @LazyText.Text- test $ f (LazyByteString.pack []) `Hspec.shouldBe` Just (LazyText.pack "")- test $ f (LazyByteString.pack [0x61]) `Hspec.shouldBe` Just (LazyText.pack "a")- test $ f (LazyByteString.pack [0xff]) `Hspec.shouldBe` Nothing-- -- ShortByteString-- Hspec.describe "From [Word8] ShortByteString" $ do- let f = Witch.from @[Word.Word8] @ShortByteString.ShortByteString- test $ f [] `Hspec.shouldBe` ShortByteString.pack []- test $ f [0x00] `Hspec.shouldBe` ShortByteString.pack [0x00]- test $ f [0x0f, 0xf0] `Hspec.shouldBe` ShortByteString.pack [0x0f, 0xf0]-- Hspec.describe "From ShortByteString [Word8]" $ do- let f = Witch.from @ShortByteString.ShortByteString @[Word.Word8]- test $ f (ShortByteString.pack []) `Hspec.shouldBe` []- test $ f (ShortByteString.pack [0x00]) `Hspec.shouldBe` [0x00]- test $ f (ShortByteString.pack [0x0f, 0xf0]) `Hspec.shouldBe` [0x0f, 0xf0]-- Hspec.describe "From ShortByteString ByteString" $ do- let f = Witch.from @ShortByteString.ShortByteString @ByteString.ByteString- test $ f (ShortByteString.pack []) `Hspec.shouldBe` ByteString.pack []- test $ f (ShortByteString.pack [0x00]) `Hspec.shouldBe` ByteString.pack [0x00]- test $ f (ShortByteString.pack [0x0f, 0xf0]) `Hspec.shouldBe` ByteString.pack [0x0f, 0xf0]-- -- Text-- Hspec.describe "From String Text" $ do- let f = Witch.from @String @Text.Text- test $ f "" `Hspec.shouldBe` Text.pack ""- test $ f "a" `Hspec.shouldBe` Text.pack "a"- test $ f "ab" `Hspec.shouldBe` Text.pack "ab"-- Hspec.describe "From Text String" $ do- let f = Witch.from @Text.Text @String- test $ f (Text.pack "") `Hspec.shouldBe` ""- test $ f (Text.pack "a") `Hspec.shouldBe` "a"- test $ f (Text.pack "ab") `Hspec.shouldBe` "ab"-- Hspec.describe "From Text LazyText" $ do- let f = Witch.from @Text.Text @LazyText.Text- test $ f (Text.pack "") `Hspec.shouldBe` LazyText.pack ""- test $ f (Text.pack "a") `Hspec.shouldBe` LazyText.pack "a"- test $ f (Text.pack "ab") `Hspec.shouldBe` LazyText.pack "ab"-- Hspec.describe "From Text ByteString" $ do- let f = Witch.from @Text.Text @ByteString.ByteString- test $ f (Text.pack "") `Hspec.shouldBe` ByteString.pack []- test $ f (Text.pack "a") `Hspec.shouldBe` ByteString.pack [0x61]-- -- LazyText-- Hspec.describe "From String LazyText" $ do- let f = Witch.from @String @LazyText.Text- test $ f "" `Hspec.shouldBe` LazyText.pack ""- test $ f "a" `Hspec.shouldBe` LazyText.pack "a"- test $ f "ab" `Hspec.shouldBe` LazyText.pack "ab"-- Hspec.describe "From LazyText String" $ do- let f = Witch.from @LazyText.Text @String- test $ f (LazyText.pack "") `Hspec.shouldBe` ""- test $ f (LazyText.pack "a") `Hspec.shouldBe` "a"- test $ f (LazyText.pack "ab") `Hspec.shouldBe` "ab"-- Hspec.describe "From LazyText Text" $ do- let f = Witch.from @LazyText.Text @Text.Text- test $ f (LazyText.pack "") `Hspec.shouldBe` Text.pack ""- test $ f (LazyText.pack "a") `Hspec.shouldBe` Text.pack "a"- test $ f (LazyText.pack "ab") `Hspec.shouldBe` Text.pack "ab"-- Hspec.describe "From LazyText LazyByteString" $ do- let f = Witch.from @LazyText.Text @LazyByteString.ByteString- test $ f (LazyText.pack "") `Hspec.shouldBe` LazyByteString.pack []- test $ f (LazyText.pack "a") `Hspec.shouldBe` LazyByteString.pack [0x61]-- -- TryFromException-- Hspec.describe "From (TryFromException s t0) (TryFromException s t1)" $ do- Hspec.it "needs tests" Hspec.pending-- -- Day-- Hspec.describe "From Integer Day" $ do- let f = Witch.from @Integer @Time.Day- test $ f 0 `Hspec.shouldBe` Time.ModifiedJulianDay 0-- Hspec.describe "From Day Integer" $ do- let f = Witch.from @Time.Day @Integer- test $ f (Time.ModifiedJulianDay 0) `Hspec.shouldBe` 0-- -- DayOfWeek-- Hspec.describe "From Day DayOfWeek" $ do- let f = Witch.from @Time.Day @Time.DayOfWeek- test $ f (Time.ModifiedJulianDay 0) `Hspec.shouldBe` Time.Wednesday-- -- UniversalTime-- Hspec.describe "From Rational UniversalTime" $ do- let f = Witch.from @Rational @Time.UniversalTime- test $ f 0 `Hspec.shouldBe` Time.ModJulianDate 0-- Hspec.describe "From UniversalTime Rational" $ do- let f = Witch.from @Time.UniversalTime @Rational- test $ f (Time.ModJulianDate 0) `Hspec.shouldBe` 0-- -- DiffTime-- Hspec.describe "From Pico DiffTime" $ do- let f = Witch.from @Fixed.Pico @Time.DiffTime- test $ f 0 `Hspec.shouldBe` 0-- Hspec.describe "From DiffTime Pico" $ do- let f = Witch.from @Time.DiffTime @Fixed.Pico- test $ f 0 `Hspec.shouldBe` 0-- -- NominalDiffTime-- Hspec.describe "From Pico NominalDiffTime" $ do- let f = Witch.from @Fixed.Pico @Time.NominalDiffTime- test $ f 0 `Hspec.shouldBe` 0-- Hspec.describe "From NominalDiffTime Pico" $ do- let f = Witch.from @Time.NominalDiffTime @Fixed.Pico- test $ f 0 `Hspec.shouldBe` 0-- -- POSIXTime-- Hspec.describe "From SystemTime POSIXTime" $ do- let f = Witch.from @Time.SystemTime @Time.POSIXTime- test $ f (Time.MkSystemTime 0 0) `Hspec.shouldBe` 0-- Hspec.describe "From UTCTime POSIXTime" $ do- let f = Witch.from @Time.UTCTime @Time.POSIXTime- test $ f unixEpoch `Hspec.shouldBe` 0-- Hspec.describe "From POSIXTime UTCTime" $ do- let f = Witch.from @Time.POSIXTime @Time.UTCTime- test $ f 0 `Hspec.shouldBe` unixEpoch-- -- SystemTime-- Hspec.describe "From UTCTime SystemTime" $ do- let f = Witch.from @Time.UTCTime @Time.SystemTime- test $ f unixEpoch `Hspec.shouldBe` Time.MkSystemTime 0 0-- Hspec.describe "From SystemTime AbsoluteTime" $ do- let f = Witch.from @Time.SystemTime @Time.AbsoluteTime- test $ f (Time.MkSystemTime (-3506716800) 0) `Hspec.shouldBe` Time.taiEpoch-- Hspec.describe "From SystemTime UTCTime" $ do- let f = Witch.from @Time.SystemTime @Time.UTCTime- test $ f (Time.MkSystemTime 0 0) `Hspec.shouldBe` unixEpoch-- -- TimeOfDay-- Hspec.describe "From DiffTime TimeOfDay" $ do- let f = Witch.from @Time.DiffTime @Time.TimeOfDay- test $ f 0 `Hspec.shouldBe` Time.TimeOfDay 0 0 0-- Hspec.describe "From Rational TimeOfDay" $ do- let f = Witch.from @Rational @Time.TimeOfDay- test $ f 0 `Hspec.shouldBe` Time.TimeOfDay 0 0 0-- Hspec.describe "From TimeOfDay DiffTime" $ do- let f = Witch.from @Time.TimeOfDay @Time.DiffTime- test $ f (Time.TimeOfDay 0 0 0) `Hspec.shouldBe` 0-- Hspec.describe "From TimeOfDay Rational" $ do- let f = Witch.from @Time.TimeOfDay @Rational- test $ f (Time.TimeOfDay 0 0 0) `Hspec.shouldBe` 0-- -- CalendarDiffTime-- Hspec.describe "From CalendarDiffDays CalendarDiffTime" $ do- let f = Witch.from @Time.CalendarDiffDays @Time.CalendarDiffTime- test $ f (Time.CalendarDiffDays 0 0) `Hspec.shouldBe` Time.CalendarDiffTime 0 0-- Hspec.describe "From NominalDiffTime CalendarDiffTime" $ do- let f = Witch.from @Time.NominalDiffTime @Time.CalendarDiffTime- test $ f 0 `Hspec.shouldBe` Time.CalendarDiffTime 0 0-- -- ZonedTime-- Hspec.describe "From ZonedTime UTCTime" $ do- let f = Witch.from @Time.ZonedTime @Time.UTCTime- test $ f (Time.ZonedTime (Time.LocalTime (Time.ModifiedJulianDay 0) (Time.TimeOfDay 0 0 0)) Time.utc) `Hspec.shouldBe` Time.UTCTime (Time.ModifiedJulianDay 0) 0--test :: Hspec.Example a => a -> Hspec.SpecWith (Hspec.Arg a)-test = Hspec.it ""--untested :: Hspec.SpecWith a-untested = Hspec.runIO $ Exception.throwIO Untested--hush :: Either x a -> Maybe a-hush = either (const Nothing) Just--unixEpoch :: Time.UTCTime-unixEpoch = Time.UTCTime (Time.ModifiedJulianDay 40587) 0--data Untested- = Untested- deriving (Eq, Show)--instance Exception.Exception Untested+{-# OPTIONS_GHC -Wno-error=overflowed-literals #-}++{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeApplications #-}++import qualified Control.Exception as Exception+import qualified Data.ByteString as ByteString+import qualified Data.ByteString.Lazy as LazyByteString+import qualified Data.ByteString.Short as ShortByteString+import qualified Data.Complex as Complex+import qualified Data.Either as Either+import qualified Data.Fixed as Fixed+import qualified Data.Int as Int+import qualified Data.IntMap as IntMap+import qualified Data.IntSet as IntSet+import qualified Data.List.NonEmpty as NonEmpty+import qualified Data.Map as Map+import qualified Data.Ratio as Ratio+import qualified Data.Sequence as Seq+import qualified Data.Set as Set+import qualified Data.Text as Text+import qualified Data.Text.Lazy as LazyText+import qualified Data.Time as Time+import qualified Data.Time.Clock.POSIX as Time+import qualified Data.Time.Clock.System as Time+import qualified Data.Time.Clock.TAI as Time+import qualified Data.Word as Word+import qualified Numeric.Natural as Natural+import Test.HUnit (Test(TestCase), assertBool, runTestTTAndExit, (~:), (~?=))+import qualified Witch++main :: IO ()+main = runTestTTAndExit $ "Witch" ~:+ [ "From" ~:+ [ "from" ~:+ [ Witch.from (1 :: Int.Int8) ~?= (1 :: Int.Int16)+ ]+ ]+ , "TryFrom" ~:+ [ "tryFrom" ~:+ let f = hush . Witch.tryFrom @Int.Int16 @Int.Int8 in+ [ f 1 ~?= Just 1+ , f 128 ~?= Nothing+ ]+ ]+ , "Utility" ~:+ [ "as" ~:+ [ Witch.as @Int.Int8 1 ~?= 1+ ]+ , "from" ~:+ [ Witch.from @Int.Int8 1 ~?= (1 :: Int.Int16)+ ]+ , "into" ~:+ [ Witch.into @Int.Int16 (1 :: Int.Int8) ~?= 1+ ]+ , "over" ~:+ [ Witch.over @Int.Int8 (+ 1) (Age 1) ~?= Age 2+ ]+ , "via" ~:+ [ Witch.via @Int.Int16 (1 :: Int.Int8) ~?= (1 :: Int.Int32)+ ]+ , "tryFrom" ~:+ [ hush (Witch.tryFrom @Int.Int16 1) ~?= Just (1 :: Int.Int8)+ ]+ , "tryInto" ~:+ [ hush (Witch.tryInto @Int.Int8 (1 :: Int.Int16)) ~?= Just 1+ ]+ , "tryVia" ~:+ let f = Witch.tryVia @Int.Int16 @Int.Int32 @Int.Int8 in+ [ hush (f 1) ~?= Just 1+ , hush (f 128) ~?= Nothing+ , hush (f 32768) ~?= Nothing+ ]+ , "unsafeFrom" ~:+ let f = Witch.unsafeFrom @Int.Int16 @Int.Int8 in+ [ f 1 ~?= 1+ , TestCase $ do+ result <- Exception.try @Exception.SomeException . Exception.evaluate $ f 128+ assertBool (show result) $ Either.isLeft result+ ]+ , "unsafeInto" ~:+ [ Witch.unsafeInto @Int.Int8 (1 :: Int.Int16) ~?= 1+ ]+ ]+ , "Lift" ~:+ [ "liftedFrom" ~:+ [ ($$(Witch.liftedFrom (1 :: Int.Int16)) :: Int.Int8) ~?= 1+ ]+ , "liftedInto" ~:+ [ $$(Witch.liftedInto @Int.Int8 (1 :: Int.Int16)) ~?= 1+ ]+ ]+ , "Instances" ~:+ [ "From Int8 Int16" ~:+ let f = Witch.from @Int.Int8 @Int.Int16 in+ [ f 0 ~?= 0+ , f 127 ~?= 127+ , f (-128) ~?= (-128)+ ]+ , "From Int8 Int32" ~:+ let f = Witch.from @Int.Int8 @Int.Int32 in+ [ f 0 ~?= 0+ , f 127 ~?= 127+ , f (-128) ~?= (-128)+ ]+ , "From Int8 Int64" ~:+ let f = Witch.from @Int.Int8 @Int.Int64 in+ [ f 0 ~?= 0+ , f 127 ~?= 127+ , f (-128) ~?= (-128)+ ]+ , "From Int8 Int" ~:+ let f = Witch.from @Int.Int8 @Int in+ [ f 0 ~?= 0+ , f 127 ~?= 127+ , f (-128) ~?= (-128)+ ]+ , "From Int8 Integer" ~:+ let f = Witch.from @Int.Int8 @Integer in+ [ f 0 ~?= 0+ , f 127 ~?= 127+ , f (-128) ~?= (-128)+ ]+ , "TryFrom Int8 Word8" ~:+ let f = hush . Witch.tryFrom @Int.Int8 @Word.Word8 in+ [ f 0 ~?= Just 0+ , f 127 ~?= Just 127+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int8 Word16" ~:+ let f = hush . Witch.tryFrom @Int.Int8 @Word.Word16 in+ [ f 0 ~?= Just 0+ , f 127 ~?= Just 127+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int8 Word32" ~:+ let f = hush . Witch.tryFrom @Int.Int8 @Word.Word32 in+ [ f 0 ~?= Just 0+ , f 127 ~?= Just 127+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int8 Word64" ~:+ let f = hush . Witch.tryFrom @Int.Int8 @Word.Word64 in+ [ f 0 ~?= Just 0+ , f 127 ~?= Just 127+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int8 Word" ~:+ let f = hush . Witch.tryFrom @Int.Int8 @Word in+ [ f 0 ~?= Just 0+ , f 127 ~?= Just 127+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int8 Natural" ~:+ let f = hush . Witch.tryFrom @Int.Int8 @Natural.Natural in+ [ f 0 ~?= Just 0+ , f 127 ~?= Just 127+ , f (-1) ~?= Nothing+ ]+ , "From Int8 Float" ~:+ let f = Witch.from @Int.Int8 @Float in+ [ f 0 ~?= 0+ , f 127 ~?= 127+ , f (-128) ~?= (-128)+ ]+ , "From Int8 Double" ~:+ let f = Witch.from @Int.Int8 @Double in+ [ f 0 ~?= 0+ , f 127 ~?= 127+ , f (-128) ~?= (-128)+ ]+ , "TryFrom Int16 Int8" ~:+ let f = hush . Witch.tryFrom @Int.Int16 @Int.Int8 in+ [ f 0 ~?= Just 0+ , f 127 ~?= Just 127+ , f 128 ~?= Nothing+ , f (-128) ~?= Just (-128)+ , f (-129) ~?= Nothing+ ]+ , "From Int16 Int32" ~:+ let f = Witch.from @Int.Int16 @Int.Int32 in+ [ f 0 ~?= 0+ , f 32767 ~?= 32767+ , f (-32768) ~?= (-32768)+ ]+ , "From Int16 Int64" ~:+ let f = Witch.from @Int.Int16 @Int.Int64 in+ [ f 0 ~?= 0+ , f 32767 ~?= 32767+ , f (-32768) ~?= (-32768)+ ]+ , "From Int16 Int" ~:+ let f = Witch.from @Int.Int16 @Int in+ [ f 0 ~?= 0+ , f 32767 ~?= 32767+ , f (-32768) ~?= (-32768)+ ]+ , "From Int16 Integer" ~:+ let f = Witch.from @Int.Int16 @Integer in+ [ f 0 ~?= 0+ , f 32767 ~?= 32767+ , f (-32768) ~?= (-32768)+ ]+ , "TryFrom Int16 Word8" ~:+ let f = hush . Witch.tryFrom @Int.Int16 @Word.Word8 in+ [ f 0 ~?= Just 0+ , f 255 ~?= Just 255+ , f 256 ~?= Nothing+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int16 Word16" ~:+ let f = hush . Witch.tryFrom @Int.Int16 @Word.Word16 in+ [ f 0 ~?= Just 0+ , f 127 ~?= Just 127+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int16 Word32" ~:+ let f = hush . Witch.tryFrom @Int.Int16 @Word.Word32 in+ [ f 0 ~?= Just 0+ , f 32767 ~?= Just 32767+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int16 Word64" ~:+ let f = hush . Witch.tryFrom @Int.Int16 @Word.Word64 in+ [ f 0 ~?= Just 0+ , f 32767 ~?= Just 32767+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int16 Word" ~:+ let f = hush . Witch.tryFrom @Int.Int16 @Word in+ [ f 0 ~?= Just 0+ , f 32767 ~?= Just 32767+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int16 Natural" ~:+ let f = hush . Witch.tryFrom @Int.Int16 @Natural.Natural in+ [ f 0 ~?= Just 0+ , f 32767 ~?= Just 32767+ , f (-1) ~?= Nothing+ ]+ , "From Int16 Float" ~:+ let f = Witch.from @Int.Int16 @Float in+ [ f 0 ~?= 0+ , f 32767 ~?= 32767+ , f (-32768) ~?= (-32768)+ ]+ , "From Int16 Double" ~:+ let f = Witch.from @Int.Int16 @Double in+ [ f 0 ~?= 0+ , f 32767 ~?= 32767+ , f (-32768) ~?= (-32768)+ ]+ ]+ , "TryFrom Int32 Int8" ~:+ let f = hush . Witch.tryFrom @Int.Int32 @Int.Int8 in+ [ f 0 ~?= Just 0+ , f 127 ~?= Just 127+ , f 128 ~?= Nothing+ , f (-128) ~?= Just (-128)+ , f (-129) ~?= Nothing+ ]+ , "TryFrom Int32 Int16" ~:+ let f = hush . Witch.tryFrom @Int.Int32 @Int.Int16 in+ [ f 0 ~?= Just 0+ , f 32767 ~?= Just 32767+ , f 32768 ~?= Nothing+ , f (-32768) ~?= Just (-32768)+ , f (-32769) ~?= Nothing+ ]+ , "From Int32 Int64" ~:+ let f = Witch.from @Int.Int32 @Int.Int64 in+ [ f 0 ~?= 0+ , f 2147483647 ~?= 2147483647+ , f (-2147483648) ~?= (-2147483648)+ ]+ , "TryFrom Int32 Int" ~:+ let f = hush . Witch.tryFrom @Int.Int32 @Int in+ [ f 0 ~?= Just 0+ , f 2147483647 ~?= Just 2147483647+ , f (-2147483648) ~?= Just (-2147483648)+ ]+ , "From Int32 Integer" ~:+ let f = Witch.from @Int.Int32 @Integer in+ [ f 0 ~?= 0+ , f 2147483647 ~?= 2147483647+ , f (-2147483648) ~?= (-2147483648)+ ]+ , "TryFrom Int32 Word8" ~:+ let f = hush . Witch.tryFrom @Int.Int32 @Word.Word8 in+ [ f 0 ~?= Just 0+ , f 255 ~?= Just 255+ , f 256 ~?= Nothing+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int32 Word16" ~:+ let f = hush . Witch.tryFrom @Int.Int32 @Word.Word16 in+ [ f 0 ~?= Just 0+ , f 65535 ~?= Just 65535+ , f 65536 ~?= Nothing+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int32 Word32" ~:+ let f = hush . Witch.tryFrom @Int.Int32 @Word.Word32 in+ [ f 0 ~?= Just 0+ , f 2147483647 ~?= Just 2147483647+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int32 Word64" ~:+ let f = hush . Witch.tryFrom @Int.Int32 @Word.Word64 in+ [ f 0 ~?= Just 0+ , f 2147483647 ~?= Just 2147483647+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int32 Word" ~:+ let f = hush . Witch.tryFrom @Int.Int32 @Word in+ [ f 0 ~?= Just 0+ , f 2147483647 ~?= Just 2147483647+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int32 Natural" ~:+ let f = hush . Witch.tryFrom @Int.Int32 @Natural.Natural in+ [ f 0 ~?= Just 0+ , f 2147483647 ~?= Just 2147483647+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int32 Float" ~:+ let f = hush . Witch.tryFrom @Int.Int32 @Float in+ [ f 0 ~?= Just 0+ , f 16777215 ~?= Just 16777215+ , f 16777216 ~?= Nothing+ , f (-16777215) ~?= Just (-16777215)+ , f (-16777216) ~?= Nothing+ ]+ , "From Int32 Double" ~:+ let f = Witch.from @Int.Int32 @Double in+ [ f 0 ~?= 0+ , f 2147483647 ~?= 2147483647+ , f (-2147483648) ~?= (-2147483648)+ ]+ , "TryFrom Int64 Int8" ~:+ let f = hush . Witch.tryFrom @Int.Int64 @Int.Int8 in+ [ f 0 ~?= Just 0+ , f 127 ~?= Just 127+ , f 128 ~?= Nothing+ , f (-128) ~?= Just (-128)+ , f (-129) ~?= Nothing+ ]+ , "TryFrom Int64 Int16" ~:+ let f = hush . Witch.tryFrom @Int.Int64 @Int.Int16 in+ [ f 0 ~?= Just 0+ , f 32767 ~?= Just 32767+ , f 32768 ~?= Nothing+ , f (-32768) ~?= Just (-32768)+ , f (-32769) ~?= Nothing+ ]+ , "TryFrom Int64 Int32" ~:+ let f = hush . Witch.tryFrom @Int.Int64 @Int.Int32 in+ [ f 0 ~?= Just 0+ , f 2147483647 ~?= Just 2147483647+ , f 2147483648 ~?= Nothing+ , f (-2147483648) ~?= Just (-2147483648)+ , f (-2147483649) ~?= Nothing+ ]+ , "TryFrom Int64 Int" ~:+ let f = hush . Witch.tryFrom @Int.Int64 @Int in+ [ f 0 ~?= Just 0+ , let x = maxBound :: Int in if toInteger x >= 9223372036854775807+ then f 9223372036854775807 ~?= Just 9223372036854775807+ else f (fromIntegral x) ~?= Just x+ , let x = minBound :: Int in if toInteger x <= (-9223372036854775808)+ then f (-9223372036854775808) ~?= Just (-9223372036854775808)+ else f (fromIntegral x) ~?= Just x+ ]+ , "From Int64 Integer" ~:+ let f = Witch.from @Int.Int64 @Integer in+ [ f 0 ~?= 0+ , f 9223372036854775807 ~?= 9223372036854775807+ , f (-9223372036854775808) ~?= (-9223372036854775808)+ ]+ , "TryFrom Int64 Word8" ~:+ let f = hush . Witch.tryFrom @Int.Int64 @Word.Word8 in+ [ f 0 ~?= Just 0+ , f 255 ~?= Just 255+ , f 256 ~?= Nothing+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int64 Word16" ~:+ let f = hush . Witch.tryFrom @Int.Int64 @Word.Word16 in+ [ f 0 ~?= Just 0+ , f 65535 ~?= Just 65535+ , f 65536 ~?= Nothing+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int64 Word32" ~:+ let f = hush . Witch.tryFrom @Int.Int64 @Word.Word32 in+ [ f 0 ~?= Just 0+ , f 2147483647 ~?= Just 2147483647+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int64 Word64" ~:+ let f = hush . Witch.tryFrom @Int.Int64 @Word.Word64 in+ [ f 0 ~?= Just 0+ , f 9223372036854775807 ~?= Just 9223372036854775807+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int64 Word" ~:+ let f = hush . Witch.tryFrom @Int.Int64 @Word in+ [ f 0 ~?= Just 0+ , let x = maxBound :: Word in if toInteger x >= 9223372036854775807+ then f 9223372036854775807 ~?= Just 9223372036854775807+ else f (fromIntegral x) ~?= Just x+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int64 Natural" ~:+ let f = hush . Witch.tryFrom @Int.Int64 @Natural.Natural in+ [ f 0 ~?= Just 0+ , f 9223372036854775807 ~?= Just 9223372036854775807+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int64 Float" ~:+ let f = hush . Witch.tryFrom @Int.Int64 @Float in+ [ f 0 ~?= Just 0+ , f 16777215 ~?= Just 16777215+ , f 16777216 ~?= Nothing+ , f (-16777215) ~?= Just (-16777215)+ , f (-16777216) ~?= Nothing+ ]+ , "TryFrom Int64 Double" ~:+ let f = hush . Witch.tryFrom @Int.Int64 @Double in+ [ f 0 ~?= Just 0+ , f 9007199254740991 ~?= Just 9007199254740991+ , f 9007199254740992 ~?= Nothing+ , f (-9007199254740991) ~?= Just (-9007199254740991)+ , f (-9007199254740992) ~?= Nothing+ ]+ , "TryFrom Int Int8" ~:+ let f = hush . Witch.tryFrom @Int @Int.Int8 in+ [ f 0 ~?= Just 0+ , f 127 ~?= Just 127+ , f 128 ~?= Nothing+ , f (-128) ~?= Just (-128)+ , f (-129) ~?= Nothing+ ]+ , "TryFrom Int Int16" ~:+ let f = hush . Witch.tryFrom @Int @Int.Int16 in+ [ f 0 ~?= Just 0+ , f 32767 ~?= Just 32767+ , f 32768 ~?= Nothing+ , f (-32768) ~?= Just (-32768)+ , f (-32769) ~?= Nothing+ ]+ , "TryFrom Int Int32" ~:+ let f = hush . Witch.tryFrom @Int @Int.Int32 in+ [ f 0 ~?= Just 0+ , f 2147483647 ~?= Just 2147483647+ , let x = maxBound :: Int in if toInteger x >= 2147483648+ then f 2147483648 ~?= Nothing+ else f x ~?= Just (fromIntegral x)+ , f (-2147483648) ~?= Just (-2147483648)+ , let x = minBound :: Int in if toInteger x <= (-2147483649)+ then f (-2147483649) ~?= Nothing+ else f x ~?= Just (fromIntegral x)+ ]+ , "From Int Int64" ~:+ let f = Witch.from @Int @Int.Int64 in+ [ f 0 ~?= 0+ , f maxBound ~?= fromIntegral (maxBound :: Int)+ , f minBound ~?= fromIntegral (minBound :: Int)+ ]+ , "From Int Integer" ~:+ let f = Witch.from @Int @Integer in+ [ f 0 ~?= 0+ , f maxBound ~?= fromIntegral (maxBound :: Int)+ , f minBound ~?= fromIntegral (minBound :: Int)+ ]+ , "TryFrom Int Word8" ~:+ let f = hush . Witch.tryFrom @Int @Word.Word8 in+ [ f 0 ~?= Just 0+ , f 255 ~?= Just 255+ , f 256 ~?= Nothing+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int Word16" ~:+ let f = hush . Witch.tryFrom @Int @Word.Word16 in+ [ f 0 ~?= Just 0+ , f 65535 ~?= Just 65535+ , f 65536 ~?= Nothing+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int Word32" ~:+ let f = hush . Witch.tryFrom @Int @Word.Word32 in+ [ f 0 ~?= Just 0+ , let x = maxBound :: Int in if toInteger x >= 4294967295+ then f 4294967295 ~?= Just 4294967295+ else f x ~?= Just (fromIntegral x)+ , let x = maxBound :: Int in if toInteger x >= 4294967296+ then f 4294967296 ~?= Nothing+ else f x ~?= Just (fromIntegral x)+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int Word64" ~:+ let f = hush . Witch.tryFrom @Int @Word.Word64 in+ [ f 0 ~?= Just 0+ , f maxBound ~?= Just (fromIntegral (maxBound :: Int))+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int Word" ~:+ let f = hush . Witch.tryFrom @Int @Word in+ [ f 0 ~?= Just 0+ , f maxBound ~?= Just (fromIntegral (maxBound :: Int))+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int Natural" ~:+ let f = hush . Witch.tryFrom @Int @Natural.Natural in+ [ f 0 ~?= Just 0+ , f maxBound ~?= Just (fromIntegral (maxBound :: Int))+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Int Float" ~:+ let f = hush . Witch.tryFrom @Int @Float in+ [ f 0 ~?= Just 0+ , f 16777215 ~?= Just 16777215+ , f 16777216 ~?= Nothing+ , f (-16777215) ~?= Just (-16777215)+ , f (-16777216) ~?= Nothing+ ]+ , "TryFrom Int Double" ~:+ let f = hush . Witch.tryFrom @Int @Double in+ [ f 0 ~?= Just 0+ , let x = maxBound :: Int in if toInteger x >= 9007199254740991+ then f 9007199254740991 ~?= Just 9007199254740991+ else f x ~?= Just (fromIntegral x)+ , let x = maxBound :: Int in if toInteger x >= 9007199254740992+ then f 9007199254740992 ~?= Nothing+ else f x ~?= Just (fromIntegral x)+ , let x = minBound :: Int in if toInteger x <= (-9007199254740991)+ then f (-9007199254740991) ~?= Just (-9007199254740991)+ else f x ~?= Just (fromIntegral x)+ , let x = minBound :: Int in if toInteger x <= (-9007199254740992)+ then f (-9007199254740992) ~?= Nothing+ else f x ~?= Just (fromIntegral x)+ ]+ , "TryFrom Integer Int8" ~:+ let f = hush . Witch.tryFrom @Integer @Int.Int8 in+ [ f 0 ~?= Just 0+ , f 127 ~?= Just 127+ , f 128 ~?= Nothing+ , f (-128) ~?= Just (-128)+ , f (-129) ~?= Nothing+ ]+ , "TryFrom Integer Int16" ~:+ let f = hush . Witch.tryFrom @Integer @Int.Int16 in+ [ f 0 ~?= Just 0+ , f 32767 ~?= Just 32767+ , f 32768 ~?= Nothing+ , f (-32768) ~?= Just (-32768)+ , f (-32769) ~?= Nothing+ ]+ , "TryFrom Integer Int32" ~:+ let f = hush . Witch.tryFrom @Integer @Int.Int32 in+ [ f 0 ~?= Just 0+ , f 2147483647 ~?= Just 2147483647+ , f 2147483648 ~?= Nothing+ , f (-2147483648) ~?= Just (-2147483648)+ , f (-2147483649) ~?= Nothing+ ]+ , "TryFrom Integer Int64" ~:+ let f = hush . Witch.tryFrom @Integer @Int.Int64 in+ [ f 0 ~?= Just 0+ , f 9223372036854775807 ~?= Just 9223372036854775807+ , f 9223372036854775808 ~?= Nothing+ , f (-9223372036854775808) ~?= Just (-9223372036854775808)+ , f (-9223372036854775809) ~?= Nothing+ ]+ , "TryFrom Integer Int" ~:+ let f = hush . Witch.tryFrom @Integer @Int in+ [ f 0 ~?= Just 0+ , let x = maxBound :: Int in f (fromIntegral x) ~?= Just x+ , let x = toInteger (maxBound :: Int) + 1 in f x ~?= Nothing+ , let x = minBound :: Int in f (fromIntegral x) ~?= Just x+ , let x = toInteger (minBound :: Int) - 1 in f x ~?= Nothing+ ]+ , "TryFrom Integer Word8" ~:+ let f = hush . Witch.tryFrom @Integer @Word.Word8 in+ [ f 0 ~?= Just 0+ , f 255 ~?= Just 255+ , f 256 ~?= Nothing+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Integer Word16" ~:+ let f = hush . Witch.tryFrom @Integer @Word.Word16 in+ [ f 0 ~?= Just 0+ , f 65535 ~?= Just 65535+ , f 65536 ~?= Nothing+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Integer Word32" ~:+ let f = hush . Witch.tryFrom @Integer @Word.Word32 in+ [ f 0 ~?= Just 0+ , f 4294967295 ~?= Just 4294967295+ , f 4294967296 ~?= Nothing+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Integer Word64" ~:+ let f = hush . Witch.tryFrom @Integer @Word.Word64 in+ [ f 0 ~?= Just 0+ , f 18446744073709551615 ~?= Just 18446744073709551615+ , f 18446744073709551616 ~?= Nothing+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Integer Word" ~:+ let f = hush . Witch.tryFrom @Integer @Word in+ [ f 0 ~?= Just 0+ , let x = maxBound :: Word in f (fromIntegral x) ~?= Just x+ , let x = toInteger (maxBound :: Word) + 1 in f x ~?= Nothing+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Integer Natural" ~:+ let f = hush . Witch.tryFrom @Integer @Natural.Natural in+ [ f 0 ~?= Just 0+ , f 18446744073709551616 ~?= Just 18446744073709551616+ , f (-1) ~?= Nothing+ ]+ , "TryFrom Integer Float" ~:+ let f = hush . Witch.tryFrom @Integer @Float in+ [ f 0 ~?= Just 0+ , f 16777215 ~?= Just 16777215+ , f 16777216 ~?= Nothing+ , f (-16777215) ~?= Just (-16777215)+ , f (-16777216) ~?= Nothing+ ]+ , "TryFrom Integer Double" ~:+ let f = hush . Witch.tryFrom @Integer @Double in+ [ f 0 ~?= Just 0+ , f 9007199254740991 ~?= Just 9007199254740991+ , f 9007199254740992 ~?= Nothing+ , f (-9007199254740991) ~?= Just (-9007199254740991)+ , f (-9007199254740992) ~?= Nothing+ ]+ , "From Word8 Word16" ~:+ let f = Witch.from @Word.Word8 @Word.Word16 in+ [ f 0 ~?= 0+ , f 255 ~?= 255+ ]+ , "From Word8 Word32" ~:+ let f = Witch.from @Word.Word8 @Word.Word32 in+ [ f 0 ~?= 0+ , f 255 ~?= 255+ ]+ , "From Word8 Word64" ~:+ let f = Witch.from @Word.Word8 @Word.Word64 in+ [ f 0 ~?= 0+ , f 255 ~?= 255+ ]+ , "From Word8 Word" ~:+ let f = Witch.from @Word.Word8 @Word in+ [ f 0 ~?= 0+ , f 255 ~?= 255+ ]+ , "From Word8 Natural" ~:+ let f = Witch.from @Word.Word8 @Natural.Natural in+ [ f 0 ~?= 0+ , f 255 ~?= 255+ ]+ , "TryFrom Word8 Int8" ~:+ let f = hush . Witch.tryFrom @Word.Word8 @Int.Int8 in+ [ f 0 ~?= Just 0+ , f 127 ~?= Just 127+ , f 128 ~?= Nothing+ ]+ , "From Word8 Int16" ~:+ let f = Witch.from @Word.Word8 @Int.Int16 in+ [ f 0 ~?= 0+ , f 255 ~?= 255+ ]+ , "From Word8 Int32" ~:+ let f = Witch.from @Word.Word8 @Int.Int32 in+ [ f 0 ~?= 0+ , f 255 ~?= 255+ ]+ , "From Word8 Int64" ~:+ let f = Witch.from @Word.Word8 @Int.Int64 in+ [ f 0 ~?= 0+ , f 255 ~?= 255+ ]+ , "From Word8 Int" ~:+ let f = Witch.from @Word.Word8 @Int in+ [ f 0 ~?= 0+ , f 255 ~?= 255+ ]+ , "From Word8 Integer" ~:+ let f = Witch.from @Word.Word8 @Integer in+ [ f 0 ~?= 0+ , f 255 ~?= 255+ ]+ , "From Word8 Float" ~:+ let f = Witch.from @Word.Word8 @Float in+ [ f 0 ~?= 0+ , f 255 ~?= 255+ ]+ , "From Word8 Double" ~:+ let f = Witch.from @Word.Word8 @Double in+ [ f 0 ~?= 0+ , f 255 ~?= 255+ ]+ , "TryFrom Word16 Word8" ~:+ let f = hush . Witch.tryFrom @Word.Word16 @Word.Word8 in+ [ f 0 ~?= Just 0+ , f 255 ~?= Just 255+ , f 256 ~?= Nothing+ ]+ , "From Word16 Word32" ~:+ let f = Witch.from @Word.Word16 @Word.Word32 in+ [ f 0 ~?= 0+ , f 65535 ~?= 65535+ ]+ , "From Word16 Word64" ~:+ let f = Witch.from @Word.Word16 @Word.Word64 in+ [ f 0 ~?= 0+ , f 65535 ~?= 65535+ ]+ , "From Word16 Word" ~:+ let f = Witch.from @Word.Word16 @Word in+ [ f 0 ~?= 0+ , f 65535 ~?= 65535+ ]+ , "From Word16 Natural" ~:+ let f = Witch.from @Word.Word16 @Natural.Natural in+ [ f 0 ~?= 0+ , f 65535 ~?= 65535+ ]+ , "TryFrom Word16 Int8" ~:+ let f = hush . Witch.tryFrom @Word.Word16 @Int.Int8 in+ [ f 0 ~?= Just 0+ , f 127 ~?= Just 127+ , f 128 ~?= Nothing+ ]+ , "TryFrom Word16 Int16" ~:+ let f = hush . Witch.tryFrom @Word.Word16 @Int.Int16 in+ [ f 0 ~?= Just 0+ , f 32767 ~?= Just 32767+ , f 32768 ~?= Nothing+ ]+ , "From Word16 Int32" ~:+ let f = Witch.from @Word.Word16 @Int.Int32 in+ [ f 0 ~?= 0+ , f 65535 ~?= 65535+ ]+ , "From Word16 Int64" ~:+ let f = Witch.from @Word.Word16 @Int.Int64 in+ [ f 0 ~?= 0+ , f 65535 ~?= 65535+ ]+ , "From Word16 Int" ~:+ let f = Witch.from @Word.Word16 @Int in+ [ f 0 ~?= 0+ , f 65535 ~?= 65535+ ]+ , "From Word16 Integer" ~:+ let f = Witch.from @Word.Word16 @Integer in+ [ f 0 ~?= 0+ , f 65535 ~?= 65535+ ]+ , "From Word16 Float" ~:+ let f = Witch.from @Word.Word16 @Float in+ [ f 0 ~?= 0+ , f 65535 ~?= 65535+ ]+ , "From Word16 Double" ~:+ let f = Witch.from @Word.Word16 @Double in+ [ f 0 ~?= 0+ , f 65535 ~?= 65535+ ]+ , "TryFrom Word32 Word8" ~:+ let f = hush . Witch.tryFrom @Word.Word32 @Word.Word8 in+ [ f 0 ~?= Just 0+ , f 255 ~?= Just 255+ , f 256 ~?= Nothing+ ]+ , "TryFrom Word32 Word16" ~:+ let f = hush . Witch.tryFrom @Word.Word32 @Word.Word16 in+ [ f 0 ~?= Just 0+ , f 65535 ~?= Just 65535+ , f 65536 ~?= Nothing+ ]+ , "From Word32 Word64" ~:+ let f = Witch.from @Word.Word32 @Word.Word64 in+ [ f 0 ~?= 0+ , f 4294967295 ~?= 4294967295+ ]+ , "TryFrom Word32 Word" ~:+ let f = hush . Witch.tryFrom @Word.Word32 @Word in+ [ f 0 ~?= Just 0+ , f 4294967295 ~?= Just 4294967295+ ]+ , "From Word32 Natural" ~:+ let f = Witch.from @Word.Word32 @Natural.Natural in+ [ f 0 ~?= 0+ , f 4294967295 ~?= 4294967295+ ]+ , "TryFrom Word32 Int8" ~:+ let f = hush . Witch.tryFrom @Word.Word32 @Int.Int8 in+ [ f 0 ~?= Just 0+ , f 127 ~?= Just 127+ , f 128 ~?= Nothing+ ]+ , "TryFrom Word32 Int16" ~:+ let f = hush . Witch.tryFrom @Word.Word32 @Int.Int16 in+ [ f 0 ~?= Just 0+ , f 32767 ~?= Just 32767+ , f 32768 ~?= Nothing+ ]+ , "TryFrom Word32 Int32" ~:+ let f = hush . Witch.tryFrom @Word.Word32 @Int.Int32 in+ [ f 0 ~?= Just 0+ , f 2147483647 ~?= Just 2147483647+ , f 2147483648 ~?= Nothing+ ]+ , "From Word32 Int64" ~:+ let f = Witch.from @Word.Word32 @Int.Int64 in+ [ f 0 ~?= 0+ , f 4294967295 ~?= 4294967295+ ]+ , "TryFrom Word32 Int" ~:+ let f = hush . Witch.tryFrom @Word.Word32 @Int in+ [ f 0 ~?= Just 0+ , let x = maxBound :: Int in if toInteger x >= 4294967295+ then f 4294967295 ~?= Just 4294967295+ else f (fromIntegral x) ~?= Just x+ ]+ , "From Word32 Integer" ~:+ let f = Witch.from @Word.Word32 @Integer in+ [ f 0 ~?= 0+ , f 4294967295 ~?= 4294967295+ ]+ , "TryFrom Word32 Float" ~:+ let f = hush . Witch.tryFrom @Word.Word32 @Float in+ [ f 0 ~?= Just 0+ , f 16777215 ~?= Just 16777215+ , f 16777216 ~?= Nothing+ ]+ , "From Word32 Double" ~:+ let f = Witch.from @Word.Word32 @Double in+ [ f 0 ~?= 0+ , f 4294967295 ~?= 4294967295+ ]+ , "TryFrom Word64 Word8" ~:+ let f = hush . Witch.tryFrom @Word.Word64 @Word.Word8 in+ [ f 0 ~?= Just 0+ , f 255 ~?= Just 255+ , f 256 ~?= Nothing+ ]+ , "TryFrom Word64 Word16" ~:+ let f = hush . Witch.tryFrom @Word.Word64 @Word.Word16 in+ [ f 0 ~?= Just 0+ , f 65535 ~?= Just 65535+ , f 65536 ~?= Nothing+ ]+ , "TryFrom Word64 Word32" ~:+ let f = hush . Witch.tryFrom @Word.Word64 @Word.Word32 in+ [ f 0 ~?= Just 0+ , f 4294967295 ~?= Just 4294967295+ , f 4294967296 ~?= Nothing+ ]+ , "TryFrom Word64 Word" ~:+ let f = hush . Witch.tryFrom @Word.Word64 @Word in+ [ f 0 ~?= Just 0+ , let x = maxBound :: Word in if toInteger x >= 18446744073709551615+ then f 18446744073709551615 ~?= Just 18446744073709551615+ else f (fromIntegral x) ~?= Just x+ ]+ , "From Word64 Natural" ~:+ let f = Witch.from @Word.Word64 @Natural.Natural in+ [ f 0 ~?= 0+ , f 18446744073709551615 ~?= 18446744073709551615+ ]+ , "TryFrom Word64 Int8" ~:+ let f = hush . Witch.tryFrom @Word.Word64 @Int.Int8 in+ [ f 0 ~?= Just 0+ , f 127 ~?= Just 127+ , f 128 ~?= Nothing+ ]+ , "TryFrom Word64 Int16" ~:+ let f = hush . Witch.tryFrom @Word.Word64 @Int.Int16 in+ [ f 0 ~?= Just 0+ , f 32767 ~?= Just 32767+ , f 32768 ~?= Nothing+ ]+ , "TryFrom Word64 Int32" ~:+ let f = hush . Witch.tryFrom @Word.Word64 @Int.Int32 in+ [ f 0 ~?= Just 0+ , f 2147483647 ~?= Just 2147483647+ , f 2147483648 ~?= Nothing+ ]+ , "TryFrom Word64 Int64" ~:+ let f = hush . Witch.tryFrom @Word.Word64 @Int.Int64 in+ [ f 0 ~?= Just 0+ , f 9223372036854775807 ~?= Just 9223372036854775807+ , f 9223372036854775808 ~?= Nothing+ ]+ , "TryFrom Word64 Int" ~:+ let f = hush . Witch.tryFrom @Word.Word64 @Int in+ [ f 0 ~?= Just 0+ , let x = maxBound :: Int in hush (Witch.tryFrom @Word.Word64 @Int (fromIntegral x)) ~?= Just x+ , let x = fromIntegral (maxBound :: Int) + 1 :: Word.Word64 in hush (Witch.tryFrom @Word.Word64 @Int x) ~?= Nothing+ ]+ , "From Word64 Integer" ~:+ let f = Witch.from @Word.Word64 @Integer in+ [ f 0 ~?= 0+ , f 18446744073709551615 ~?= 18446744073709551615+ ]+ , "TryFrom Word64 Float" ~:+ let f = hush . Witch.tryFrom @Word.Word64 @Float in+ [ f 0 ~?= Just 0+ , f 16777215 ~?= Just 16777215+ , f 16777216 ~?= Nothing+ ]+ , "TryFrom Word64 Double" ~:+ let f = hush . Witch.tryFrom @Word.Word64 @Double in+ [ f 0 ~?= Just 0+ , f 9007199254740991 ~?= Just 9007199254740991+ , f 9007199254740992 ~?= Nothing+ ]+ , "TryFrom Word Word8" ~:+ let f = hush . Witch.tryFrom @Word @Word.Word8 in+ [ f 0 ~?= Just 0+ , f 255 ~?= Just 255+ , f 256 ~?= Nothing+ ]+ , "TryFrom Word Word16" ~:+ let f = hush . Witch.tryFrom @Word @Word.Word16 in+ [ f 0 ~?= Just 0+ , f 65535 ~?= Just 65535+ , f 65536 ~?= Nothing+ ]+ , "TryFrom Word Word32" ~:+ let f = hush . Witch.tryFrom @Word @Word.Word32 in+ [ f 0 ~?= Just 0+ , f 4294967295 ~?= Just 4294967295+ , let x = maxBound :: Word in if toInteger x >= 4294967296+ then f 4294967296 ~?= Nothing+ else f x ~?= Just (fromIntegral x)+ ]+ , "From Word Word64" ~:+ let f = Witch.from @Word @Word.Word64 in+ [ f 0 ~?= 0+ , f maxBound ~?= fromIntegral (maxBound :: Word)+ ]+ , "From Word Natural" ~:+ let f = Witch.from @Word @Natural.Natural in+ [ f 0 ~?= 0+ , f maxBound ~?= fromIntegral (maxBound :: Word)+ ]+ , "TryFrom Word Int8" ~:+ let f = hush . Witch.tryFrom @Word @Int.Int8 in+ [ f 0 ~?= Just 0+ , f 127 ~?= Just 127+ , f 128 ~?= Nothing+ ]+ , "TryFrom Word Int16" ~:+ let f = hush . Witch.tryFrom @Word @Int.Int16 in+ [ f 0 ~?= Just 0+ , f 32767 ~?= Just 32767+ , f 32768 ~?= Nothing+ ]+ , "TryFrom Word Int32" ~:+ let f = hush . Witch.tryFrom @Word @Int.Int32 in+ [ f 0 ~?= Just 0+ , f 2147483647 ~?= Just 2147483647+ , f 2147483648 ~?= Nothing+ ]+ , "TryFrom Word Int64" ~:+ let f = hush . Witch.tryFrom @Word @Int.Int64 in+ [ f 0 ~?= Just 0+ , let x = maxBound :: Word in if toInteger x >= 9223372036854775807+ then f 9223372036854775807 ~?= Just 9223372036854775807+ else f x ~?= Just (fromIntegral x)+ , let x = maxBound :: Word in if toInteger x >= 9223372036854775808+ then f 9223372036854775808 ~?= Nothing+ else f x ~?= Just (fromIntegral x)+ ]+ , "TryFrom Word Int" ~:+ let f = hush . Witch.tryFrom @Word @Int in+ [ f 0 ~?= Just 0+ , let x = maxBound :: Int in hush (Witch.tryFrom @Word @Int (fromIntegral x)) ~?= Just x+ , let x = fromIntegral (maxBound :: Int) + 1 :: Word in hush (Witch.tryFrom @Word @Int x) ~?= Nothing+ ]+ , "From Word Integer" ~:+ let f = Witch.from @Word @Integer in+ [ f 0 ~?= 0+ , f maxBound ~?= fromIntegral (maxBound :: Word)+ ]+ , "TryFrom Word Float" ~:+ let f = hush . Witch.tryFrom @Word @Float in+ [ f 0 ~?= Just 0+ , f 16777215 ~?= Just 16777215+ , f 16777216 ~?= Nothing+ ]+ , "TryFrom Word Double" ~:+ let f = hush . Witch.tryFrom @Word @Double in+ [ f 0 ~?= Just 0+ , let x = maxBound :: Word in if toInteger x >= 9007199254740991+ then f 9007199254740991 ~?= Just 9007199254740991+ else f x ~?= Just (fromIntegral x)+ , let x = maxBound :: Word in if toInteger x >= 9007199254740992+ then f 9007199254740992 ~?= Nothing+ else f x ~?= Just (fromIntegral x)+ ]+ , "TryFrom Natural Word8" ~:+ let f = hush . Witch.tryFrom @Natural.Natural @Word.Word8 in+ [ f 0 ~?= Just 0+ , f 255 ~?= Just 255+ , f 256 ~?= Nothing+ ]+ , "TryFrom Natural Word16" ~:+ let f = hush . Witch.tryFrom @Natural.Natural @Word.Word16 in+ [ f 0 ~?= Just 0+ , f 65535 ~?= Just 65535+ , f 65536 ~?= Nothing+ ]+ , "TryFrom Natural Word32" ~:+ let f = hush . Witch.tryFrom @Natural.Natural @Word.Word32 in+ [ f 0 ~?= Just 0+ , f 4294967295 ~?= Just 4294967295+ , f 4294967296 ~?= Nothing+ ]+ , "TryFrom Natural Word64" ~:+ let f = hush . Witch.tryFrom @Natural.Natural @Word.Word64 in+ [ f 0 ~?= Just 0+ , f 18446744073709551615 ~?= Just 18446744073709551615+ , f 18446744073709551616 ~?= Nothing+ ]+ , "TryFrom Natural Word" ~:+ let f = hush . Witch.tryFrom @Natural.Natural @Word in+ [ f 0 ~?= Just 0+ , let x = maxBound :: Word in hush (Witch.tryFrom @Natural.Natural @Word (fromIntegral x)) ~?= Just x+ , let x = fromIntegral (maxBound :: Word) + 1 :: Natural.Natural in hush (Witch.tryFrom @Natural.Natural @Word x) ~?= Nothing+ ]+ , "TryFrom Natural Int8" ~:+ let f = hush . Witch.tryFrom @Natural.Natural @Int.Int8 in+ [ f 0 ~?= Just 0+ , f 127 ~?= Just 127+ , f 128 ~?= Nothing+ ]+ , "TryFrom Natural Int16" ~:+ let f = hush . Witch.tryFrom @Natural.Natural @Int.Int16 in+ [ f 0 ~?= Just 0+ , f 32767 ~?= Just 32767+ , f 32768 ~?= Nothing+ ]+ , "TryFrom Natural Int32" ~:+ let f = hush . Witch.tryFrom @Natural.Natural @Int.Int32 in+ [ f 0 ~?= Just 0+ , f 2147483647 ~?= Just 2147483647+ , f 2147483648 ~?= Nothing+ ]+ , "TryFrom Natural Int64" ~:+ let f = hush . Witch.tryFrom @Natural.Natural @Int.Int64 in+ [ f 0 ~?= Just 0+ , f 9223372036854775807 ~?= Just 9223372036854775807+ , f 9223372036854775808 ~?= Nothing+ ]+ , "TryFrom Natural Int" ~:+ let f = hush . Witch.tryFrom @Natural.Natural @Int in+ [ f 0 ~?= Just 0+ , let x = maxBound :: Int in hush (Witch.tryFrom @Natural.Natural @Int (fromIntegral x)) ~?= Just x+ , let x = fromIntegral (maxBound :: Int) + 1 :: Natural.Natural in hush (Witch.tryFrom @Natural.Natural @Int x) ~?= Nothing+ ]+ , "From Natural Integer" ~:+ let f = Witch.from @Natural.Natural @Integer in+ [ f 0 ~?= 0+ , f 9223372036854775808 ~?= 9223372036854775808+ ]+ , "TryFrom Natural Float" ~:+ let f = hush . Witch.tryFrom @Natural.Natural @Float in+ [ f 0 ~?= Just 0+ , f 16777215 ~?= Just 16777215+ , f 16777216 ~?= Nothing+ ]+ , "TryFrom Natural Double" ~:+ let f = hush . Witch.tryFrom @Natural.Natural @Double in+ [ f 0 ~?= Just 0+ , f 9007199254740991 ~?= Just 9007199254740991+ , f 9007199254740992 ~?= Nothing+ ]+ , "TryFrom Float Int8" ~:+ let f = hush . Witch.tryFrom @Float @Int.Int8 in+ [ f 0 ~?= Just 0+ , f 127 ~?= Just 127+ , f 128 ~?= Nothing+ , f (-128) ~?= Just (-128)+ , f (-129) ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Float Int16" ~:+ let f = hush . Witch.tryFrom @Float @Int.Int16 in+ [ f 0 ~?= Just 0+ , f 32767 ~?= Just 32767+ , f 32768 ~?= Nothing+ , f (-32768) ~?= Just (-32768)+ , f (-32769) ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Float Int32" ~:+ let f = hush . Witch.tryFrom @Float @Int.Int32 in+ [ f 0 ~?= Just 0+ , f 16777215 ~?= Just 16777215+ , f 16777216 ~?= Nothing+ , f (-16777215) ~?= Just (-16777215)+ , f (-16777216) ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Float Int64" ~:+ let f = hush . Witch.tryFrom @Float @Int.Int64 in+ [ f 0 ~?= Just 0+ , f 16777215 ~?= Just 16777215+ , f 16777216 ~?= Nothing+ , f (-16777215) ~?= Just (-16777215)+ , f (-16777216) ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Float Int" ~:+ let f = hush . Witch.tryFrom @Float @Int in+ [ f 0 ~?= Just 0+ , f 16777215 ~?= Just 16777215+ , f 16777216 ~?= Nothing+ , f (-16777215) ~?= Just (-16777215)+ , f (-16777216) ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Float Integer" ~:+ let f = hush . Witch.tryFrom @Float @Integer in+ [ f 0 ~?= Just 0+ , f 16777215 ~?= Just 16777215+ , f 16777216 ~?= Nothing+ , f (-16777215) ~?= Just (-16777215)+ , f (-16777216) ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Float Word8" ~:+ let f = hush . Witch.tryFrom @Float @Word.Word8 in+ [ f 0 ~?= Just 0+ , f 255 ~?= Just 255+ , f 256 ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Float Word16" ~:+ let f = hush . Witch.tryFrom @Float @Word.Word16 in+ [ f 0 ~?= Just 0+ , f 65535 ~?= Just 65535+ , f 65536 ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Float Word32" ~:+ let f = hush . Witch.tryFrom @Float @Word.Word32 in+ [ f 0 ~?= Just 0+ , f 16777215 ~?= Just 16777215+ , f 16777216 ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Float Word64" ~:+ let f = hush . Witch.tryFrom @Float @Word.Word64 in+ [ f 0 ~?= Just 0+ , f 16777215 ~?= Just 16777215+ , f 16777216 ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Float Word" ~:+ let f = hush . Witch.tryFrom @Float @Word in+ [ f 0 ~?= Just 0+ , f 16777215 ~?= Just 16777215+ , f 16777216 ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Float Natural" ~:+ let f = hush . Witch.tryFrom @Float @Natural.Natural in+ [ f 0 ~?= Just 0+ , f 16777215 ~?= Just 16777215+ , f 16777216 ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Float Rational" ~:+ let f = hush . Witch.tryFrom @Float @Rational in+ [ f 0 ~?= Just 0+ , f (-0) ~?= Just 0+ , f 0.5 ~?= Just 0.5+ , f (-0.5) ~?= Just (-0.5)+ , f 16777215 ~?= Just 16777215+ , f (-16777215) ~?= Just (-16777215)+ , f 16777216 ~?= Just 16777216+ , f (-16777216) ~?= Just (-16777216)+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "From Float Double" ~:+ let f = Witch.from @Float @Double in+ [ f 0 ~?= 0+ , f 0.5 ~?= 0.5+ , f (-0.5) ~?= (-0.5)+ , TestCase $ let x = f (0 / 0) in assertBool (show x) $ isNaN x+ , f (1 / 0) ~?= (1 / 0)+ , f (-1 / 0) ~?= (-1 / 0)+ ]+ , "TryFrom Double Int8" ~:+ let f = hush . Witch.tryFrom @Double @Int.Int8 in+ [ f 0 ~?= Just 0+ , f 127 ~?= Just 127+ , f 128 ~?= Nothing+ , f (-128) ~?= Just (-128)+ , f (-129) ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Double Int16" ~:+ let f = hush . Witch.tryFrom @Double @Int.Int16 in+ [ f 0 ~?= Just 0+ , f 32767 ~?= Just 32767+ , f 32768 ~?= Nothing+ , f (-32768) ~?= Just (-32768)+ , f (-32769) ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Double Int32" ~:+ let f = hush . Witch.tryFrom @Double @Int.Int32 in+ [ f 0 ~?= Just 0+ , f 2147483647 ~?= Just 2147483647+ , f 2147483648 ~?= Nothing+ , f (-2147483648) ~?= Just (-2147483648)+ , f (-2147483649) ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Double Int64" ~:+ let f = hush . Witch.tryFrom @Double @Int.Int64 in+ [ f 0 ~?= Just 0+ , f 9007199254740991 ~?= Just 9007199254740991+ , f 9007199254740992 ~?= Nothing+ , f (-9007199254740991) ~?= Just (-9007199254740991)+ , f (-9007199254740992) ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Double Int" ~:+ let f = hush . Witch.tryFrom @Double @Int in+ [ f 0 ~?= Just 0+ , let x = maxBound :: Int in if toInteger x >= 9007199254740991+ then f 9007199254740991 ~?= Just 9007199254740991+ else f (fromIntegral x) ~?= Just x+ , f 9007199254740992 ~?= Nothing+ , let x = minBound :: Int in if toInteger x <= (-9007199254740991)+ then f (-9007199254740991) ~?= Just (-9007199254740991)+ else f (fromIntegral x) ~?= Just x+ , f (-9007199254740992) ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Double Integer" ~:+ let f = hush . Witch.tryFrom @Double @Integer in+ [ f 0 ~?= Just 0+ , f 9007199254740991 ~?= Just 9007199254740991+ , f 9007199254740992 ~?= Nothing+ , f (-9007199254740991) ~?= Just (-9007199254740991)+ , f (-9007199254740992) ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Double Word8" ~:+ let f = hush . Witch.tryFrom @Double @Word.Word8 in+ [ f 0 ~?= Just 0+ , f 255 ~?= Just 255+ , f 256 ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Double Word16" ~:+ let f = hush . Witch.tryFrom @Double @Word.Word16 in+ [ f 0 ~?= Just 0+ , f 65535 ~?= Just 65535+ , f 65536 ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Double Word32" ~:+ let f = hush . Witch.tryFrom @Double @Word.Word32 in+ [ f 0 ~?= Just 0+ , f 4294967295 ~?= Just 4294967295+ , f 4294967296 ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Double Word64" ~:+ let f = hush . Witch.tryFrom @Double @Word.Word64 in+ [ f 0 ~?= Just 0+ , f 9007199254740991 ~?= Just 9007199254740991+ , f 9007199254740992 ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Double Word" ~:+ let f = hush . Witch.tryFrom @Double @Word in+ [ f 0 ~?= Just 0+ , let x = maxBound :: Word in if toInteger x >= 9007199254740991+ then f 9007199254740991 ~?= Just 9007199254740991+ else f (fromIntegral x) ~?= Just x+ , f 9007199254740992 ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Double Natural" ~:+ let f = hush . Witch.tryFrom @Double @Natural.Natural in+ [ f 0 ~?= Just 0+ , f 9007199254740991 ~?= Just 9007199254740991+ , f 9007199254740992 ~?= Nothing+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "TryFrom Double Rational" ~:+ let f = hush . Witch.tryFrom @Double @Rational in+ [ f 0 ~?= Just 0+ , f (-0) ~?= Just 0+ , f 0.5 ~?= Just 0.5+ , f (-0.5) ~?= Just (-0.5)+ , f 9007199254740991 ~?= Just 9007199254740991+ , f (-9007199254740991) ~?= Just (-9007199254740991)+ , f 9007199254740992 ~?= Just 9007199254740992+ , f (-9007199254740992) ~?= Just (-9007199254740992)+ , f (0 / 0) ~?= Nothing+ , f (1 / 0) ~?= Nothing+ , f (-1 / 0) ~?= Nothing+ ]+ , "From Double Float" ~:+ let f = Witch.from @Double @Float in+ [ f 0 ~?= 0+ , f 0.5 ~?= 0.5+ , f (-0.5) ~?= (-0.5)+ , TestCase $ let x = f (0 / 0) in assertBool (show x) $ isNaN x+ , f (1 / 0) ~?= (1 / 0)+ , f (-1 / 0) ~?= (-1 / 0)+ ]+ , "From a (Ratio a)" ~:+ let f = Witch.from @Int @(Ratio.Ratio Int) in+ [ Witch.from @Integer @Rational 0 ~?= 0+ , f 0 ~?= 0+ ]+ , "TryFrom (Ratio a) a" ~:+ let f = hush . Witch.tryFrom @(Ratio.Ratio Int) @Int in+ [ hush (Witch.tryFrom @Rational @Integer 0) ~?= Just 0+ , hush (Witch.tryFrom @Rational @Integer 0.5) ~?= Nothing+ , f 0 ~?= Just 0+ , f 0.5 ~?= Nothing+ ]+ , "From Rational Float" ~:+ let f = Witch.from @Rational @Float in+ [ f 0 ~?= 0+ , f 0.5 ~?= 0.5+ , f (-0.5) ~?= (-0.5)+ ]+ , "From Rational Double" ~:+ let f = Witch.from @Rational @Double in+ [ f 0 ~?= 0+ , f 0.5 ~?= 0.5+ , f (-0.5) ~?= (-0.5)+ ]+ , "From Integer (Fixed a)" ~:+ let f = Witch.from @Integer @Fixed.Deci in+ [ Witch.from @Integer @Fixed.Uni 1 ~?= 1+ , f 1 ~?= 0.1+ ]+ , "From (Fixed a) Integer" ~:+ let f = Witch.from @Fixed.Deci @Integer in+ [ Witch.from @Fixed.Uni @Integer 1 ~?= 1+ , f 1 ~?= 10+ ]+ , "From a (Complex a)" ~:+ let f = Witch.from @Float @(Complex.Complex Float) in+ [ Witch.from @Double @(Complex.Complex Double) 1 ~?= 1+ , f 1 ~?= 1+ ]+ , "TryFrom (Complex a) a" ~:+ let f = hush . Witch.tryFrom @(Complex.Complex Float) @Float in+ [ hush (Witch.tryFrom @(Complex.Complex Double) @Double 1) ~?= Just 1+ , hush (Witch.tryFrom @(Complex.Complex Double) @Double (0 Complex.:+ 1)) ~?= Nothing+ , f 1 ~?= Just 1+ , f (0 Complex.:+ 1) ~?= Nothing+ ]+ , "TryFrom [a] (NonEmpty a)" ~:+ let f = hush . Witch.tryFrom @[Int] @(NonEmpty.NonEmpty Int) in+ [ f [] ~?= Nothing+ , f [1] ~?= Just (1 NonEmpty.:| [])+ , f [1, 2] ~?= Just (1 NonEmpty.:| [2])+ ]+ , "From (NonEmpty a) [a]" ~:+ let f = Witch.from @(NonEmpty.NonEmpty Int) @[Int] in+ [ f (1 NonEmpty.:| []) ~?= [1]+ , f (1 NonEmpty.:| [2]) ~?= [1, 2]+ ]+ , "From [a] (Set a)" ~:+ let f = Witch.from @[Char] @(Set.Set Char) in+ [ f [] ~?= Set.fromList []+ , f ['a'] ~?= Set.fromList ['a']+ , f ['a', 'b'] ~?= Set.fromList ['a', 'b']+ , f ['a', 'a'] ~?= Set.fromList ['a']+ ]+ , "From (Set a) [a]" ~:+ let f = Witch.from @(Set.Set Char) @[Char] in+ [ f (Set.fromList []) ~?= []+ , f (Set.fromList ['a']) ~?= ['a']+ , f (Set.fromList ['a', 'b']) ~?= ['a', 'b']+ ]+ , "From [Int] IntSet" ~:+ let f = Witch.from @[Int] @IntSet.IntSet in+ [ f [] ~?= IntSet.fromList []+ , f [1] ~?= IntSet.fromList [1]+ , f [1, 2] ~?= IntSet.fromList [1, 2]+ ]+ , "From IntSet [Int]" ~:+ let f = Witch.from @IntSet.IntSet @[Int] in+ [ f (IntSet.fromList []) ~?= []+ , f (IntSet.fromList [1]) ~?= [1]+ , f (IntSet.fromList [1, 2]) ~?= [1, 2]+ ]+ , "From [(k, v)] (Map k v)" ~:+ let f = Witch.from @[(Char, Int)] @(Map.Map Char Int) in+ [ f [] ~?= Map.empty+ , f [('a', 1)] ~?= Map.fromList [('a', 1)]+ , f [('a', 1), ('b', 2)] ~?= Map.fromList [('a', 1), ('b', 2)]+ , f [('a', 1), ('a', 2)] ~?= Map.fromList [('a', 2)]+ ]+ , "From (Map k v) [(k, v)]" ~:+ let f = Witch.from @(Map.Map Char Int) @[(Char, Int)] in+ [ f Map.empty ~?= []+ , f (Map.fromList [('a', 1)]) ~?= [('a', 1)]+ , f (Map.fromList [('a', 1), ('b', 2)]) ~?= [('a', 1), ('b', 2)]+ ]+ , "From [(Int, v)] (IntMap v)" ~:+ let f = Witch.from @[(Int, Char)] @(IntMap.IntMap Char) in+ [ f [] ~?= IntMap.fromList []+ , f [(1, 'a')] ~?= IntMap.fromList [(1, 'a')]+ , f [(1, 'a'), (2, 'b')] ~?= IntMap.fromList [(1, 'a'), (2, 'b')]+ , f [(1, 'a'), (1, 'b')] ~?= IntMap.fromList [(1, 'b')]+ ]+ , "From (IntMap v) [(Int, v)]" ~:+ let f = Witch.from @(IntMap.IntMap Char) @[(Int, Char)] in+ [ f (IntMap.fromList []) ~?= []+ , f (IntMap.fromList [(1, 'a')]) ~?= [(1, 'a')]+ , f (IntMap.fromList [(1, 'a'), (2, 'b')]) ~?= [(1, 'a'), (2, 'b')]+ ]+ , "From [a] (Seq a)" ~:+ let f = Witch.from @[Int] @(Seq.Seq Int) in+ [ f [] ~?= Seq.fromList []+ , f [1] ~?= Seq.fromList [1]+ , f [1, 2] ~?= Seq.fromList [1, 2]+ ]+ , "From (Seq a) [a]" ~:+ let f = Witch.from @(Seq.Seq Int) @[Int] in+ [ f (Seq.fromList []) ~?= []+ , f (Seq.fromList [1]) ~?= [1]+ , f (Seq.fromList [1, 2]) ~?= [1, 2]+ ]+ , "From [Word8] ByteString" ~:+ let f = Witch.from @[Word.Word8] @ByteString.ByteString in+ [ f [] ~?= ByteString.pack []+ , f [0x00] ~?= ByteString.pack [0x00]+ , f [0x0f, 0xf0] ~?= ByteString.pack [0x0f, 0xf0]+ ]+ , "From ByteString [Word8]" ~:+ let f = Witch.from @ByteString.ByteString @[Word.Word8] in+ [ f (ByteString.pack []) ~?= []+ , f (ByteString.pack [0x00]) ~?= [0x00]+ , f (ByteString.pack [0x0f, 0xf0]) ~?= [0x0f, 0xf0]+ ]+ , "From ByteString LazyByteString" ~:+ let f = Witch.from @ByteString.ByteString @LazyByteString.ByteString in+ [ f (ByteString.pack []) ~?= LazyByteString.pack []+ , f (ByteString.pack [0x00]) ~?= LazyByteString.pack [0x00]+ , f (ByteString.pack [0x0f, 0xf0]) ~?= LazyByteString.pack [0x0f, 0xf0]+ ]+ , "From ByteString ShortByteString" ~:+ let f = Witch.from @ByteString.ByteString @ShortByteString.ShortByteString in+ [ f (ByteString.pack []) ~?= ShortByteString.pack []+ , f (ByteString.pack [0x00]) ~?= ShortByteString.pack [0x00]+ , f (ByteString.pack [0x0f, 0xf0]) ~?= ShortByteString.pack [0x0f, 0xf0]+ ]+ , "TryFrom ByteString Text" ~:+ let f = hush . Witch.tryFrom @ByteString.ByteString @Text.Text in+ [ f (ByteString.pack []) ~?= Just (Text.pack "")+ , f (ByteString.pack [0x61]) ~?= Just (Text.pack "a")+ , f (ByteString.pack [0xff]) ~?= Nothing+ ]+ , "From [Word8] LazyByteString" ~:+ let f = Witch.from @[Word.Word8] @LazyByteString.ByteString in+ [ f [] ~?= LazyByteString.pack []+ , f [0x00] ~?= LazyByteString.pack [0x00]+ , f [0x0f, 0xf0] ~?= LazyByteString.pack [0x0f, 0xf0]+ ]+ , "From LazyByteString [Word8]" ~:+ let f = Witch.from @LazyByteString.ByteString @[Word.Word8] in+ [ f (LazyByteString.pack []) ~?= []+ , f (LazyByteString.pack [0x00]) ~?= [0x00]+ , f (LazyByteString.pack [0x0f, 0xf0]) ~?= [0x0f, 0xf0]+ ]+ , "From LazyByteString ByteString" ~:+ let f = Witch.from @LazyByteString.ByteString @ByteString.ByteString in+ [ f (LazyByteString.pack []) ~?= ByteString.pack []+ , f (LazyByteString.pack [0x00]) ~?= ByteString.pack [0x00]+ , f (LazyByteString.pack [0x0f, 0xf0]) ~?= ByteString.pack [0x0f, 0xf0]+ ]+ , "TryFrom LazyByteString LazyText" ~:+ let f = hush . Witch.tryFrom @LazyByteString.ByteString @LazyText.Text in+ [ f (LazyByteString.pack []) ~?= Just (LazyText.pack "")+ , f (LazyByteString.pack [0x61]) ~?= Just (LazyText.pack "a")+ , f (LazyByteString.pack [0xff]) ~?= Nothing+ ]+ , "From [Word8] ShortByteString" ~:+ let f = Witch.from @[Word.Word8] @ShortByteString.ShortByteString in+ [ f [] ~?= ShortByteString.pack []+ , f [0x00] ~?= ShortByteString.pack [0x00]+ , f [0x0f, 0xf0] ~?= ShortByteString.pack [0x0f, 0xf0]+ ]+ , "From ShortByteString [Word8]" ~:+ let f = Witch.from @ShortByteString.ShortByteString @[Word.Word8] in+ [ f (ShortByteString.pack []) ~?= []+ , f (ShortByteString.pack [0x00]) ~?= [0x00]+ , f (ShortByteString.pack [0x0f, 0xf0]) ~?= [0x0f, 0xf0]+ ]+ , "From ShortByteString ByteString" ~:+ let f = Witch.from @ShortByteString.ShortByteString @ByteString.ByteString in+ [ f (ShortByteString.pack []) ~?= ByteString.pack []+ , f (ShortByteString.pack [0x00]) ~?= ByteString.pack [0x00]+ , f (ShortByteString.pack [0x0f, 0xf0]) ~?= ByteString.pack [0x0f, 0xf0]+ ]+ , "From String Text" ~:+ let f = Witch.from @String @Text.Text in+ [ f "" ~?= Text.pack ""+ , f "a" ~?= Text.pack "a"+ , f "ab" ~?= Text.pack "ab"+ ]+ , "From Text String" ~:+ let f = Witch.from @Text.Text @String in+ [ f (Text.pack "") ~?= ""+ , f (Text.pack "a") ~?= "a"+ , f (Text.pack "ab") ~?= "ab"+ ]+ , "From Text LazyText" ~:+ let f = Witch.from @Text.Text @LazyText.Text in+ [ f (Text.pack "") ~?= LazyText.pack ""+ , f (Text.pack "a") ~?= LazyText.pack "a"+ , f (Text.pack "ab") ~?= LazyText.pack "ab"+ ]+ , "From Text ByteString" ~:+ let f = Witch.from @Text.Text @ByteString.ByteString in+ [ f (Text.pack "") ~?= ByteString.pack []+ , f (Text.pack "a") ~?= ByteString.pack [0x61]+ ]+ , "From String LazyText" ~:+ let f = Witch.from @String @LazyText.Text in+ [ f "" ~?= LazyText.pack ""+ , f "a" ~?= LazyText.pack "a"+ , f "ab" ~?= LazyText.pack "ab"+ ]+ , "From LazyText String" ~:+ let f = Witch.from @LazyText.Text @String in+ [ f (LazyText.pack "") ~?= ""+ , f (LazyText.pack "a") ~?= "a"+ , f (LazyText.pack "ab") ~?= "ab"+ ]+ , "From LazyText Text" ~:+ let f = Witch.from @LazyText.Text @Text.Text in+ [ f (LazyText.pack "") ~?= Text.pack ""+ , f (LazyText.pack "a") ~?= Text.pack "a"+ , f (LazyText.pack "ab") ~?= Text.pack "ab"+ ]+ , "From LazyText LazyByteString" ~:+ let f = Witch.from @LazyText.Text @LazyByteString.ByteString in+ [ f (LazyText.pack "") ~?= LazyByteString.pack []+ , f (LazyText.pack "a") ~?= LazyByteString.pack [0x61]+ ]+ , "From Integer Day" ~:+ let f = Witch.from @Integer @Time.Day in+ [ f 0 ~?= Time.ModifiedJulianDay 0+ ]+ , "From Day Integer" ~:+ let f = Witch.from @Time.Day @Integer in+ [ f (Time.ModifiedJulianDay 0) ~?= 0+ ]+ , "From Day DayOfWeek" ~:+ let f = Witch.from @Time.Day @Time.DayOfWeek in+ [ f (Time.ModifiedJulianDay 0) ~?= Time.Wednesday+ ]+ , "From Rational UniversalTime" ~:+ let f = Witch.from @Rational @Time.UniversalTime in+ [ f 0 ~?= Time.ModJulianDate 0+ ]+ , "From UniversalTime Rational" ~:+ let f = Witch.from @Time.UniversalTime @Rational in+ [ f (Time.ModJulianDate 0) ~?= 0+ ]+ , "From Pico DiffTime" ~:+ let f = Witch.from @Fixed.Pico @Time.DiffTime in+ [ f 0 ~?= 0+ ]+ , "From DiffTime Pico" ~:+ let f = Witch.from @Time.DiffTime @Fixed.Pico in+ [ f 0 ~?= 0+ ]+ , "From Pico NominalDiffTime" ~:+ let f = Witch.from @Fixed.Pico @Time.NominalDiffTime in+ [ f 0 ~?= 0+ ]+ , "From NominalDiffTime Pico" ~:+ let f = Witch.from @Time.NominalDiffTime @Fixed.Pico in+ [ f 0 ~?= 0+ ]+ , "From SystemTime POSIXTime" ~:+ let f = Witch.from @Time.SystemTime @Time.POSIXTime in+ [ f (Time.MkSystemTime 0 0) ~?= 0+ ]+ , "From UTCTime POSIXTime" ~:+ let f = Witch.from @Time.UTCTime @Time.POSIXTime in+ [ f unixEpoch ~?= 0+ ]+ , "From POSIXTime UTCTime" ~:+ let f = Witch.from @Time.POSIXTime @Time.UTCTime in+ [ f 0 ~?= unixEpoch+ ]+ , "From UTCTime SystemTime" ~:+ let f = Witch.from @Time.UTCTime @Time.SystemTime in+ [ f unixEpoch ~?= Time.MkSystemTime 0 0+ ]+ , "From SystemTime AbsoluteTime" ~:+ let f = Witch.from @Time.SystemTime @Time.AbsoluteTime in+ [ f (Time.MkSystemTime (-3506716800) 0) ~?= Time.taiEpoch+ ]+ , "From SystemTime UTCTime" ~:+ let f = Witch.from @Time.SystemTime @Time.UTCTime in+ [ f (Time.MkSystemTime 0 0) ~?= unixEpoch+ ]+ , "From DiffTime TimeOfDay" ~:+ let f = Witch.from @Time.DiffTime @Time.TimeOfDay in+ [ f 0 ~?= Time.TimeOfDay 0 0 0+ ]+ , "From Rational TimeOfDay" ~:+ let f = Witch.from @Rational @Time.TimeOfDay in+ [ f 0 ~?= Time.TimeOfDay 0 0 0+ ]+ , "From TimeOfDay DiffTime" ~:+ let f = Witch.from @Time.TimeOfDay @Time.DiffTime in+ [ f (Time.TimeOfDay 0 0 0) ~?= 0+ ]+ , "From TimeOfDay Rational" ~:+ let f = Witch.from @Time.TimeOfDay @Rational in+ [ f (Time.TimeOfDay 0 0 0) ~?= 0+ ]+ , "From CalendarDiffDays CalendarDiffTime" ~:+ let f = Witch.from @Time.CalendarDiffDays @Time.CalendarDiffTime in+ [ f (Time.CalendarDiffDays 0 0) ~?= Time.CalendarDiffTime 0 0+ ]+ , "From NominalDiffTime CalendarDiffTime" ~:+ let f = Witch.from @Time.NominalDiffTime @Time.CalendarDiffTime in+ [ f 0 ~?= Time.CalendarDiffTime 0 0+ ]+ , "From ZonedTime UTCTime" ~:+ let f = Witch.from @Time.ZonedTime @Time.UTCTime in+ [ f (Time.ZonedTime (Time.LocalTime (Time.ModifiedJulianDay 0) (Time.TimeOfDay 0 0 0)) Time.utc) ~?= Time.UTCTime (Time.ModifiedJulianDay 0) 0+ ]+ ]++unixEpoch :: Time.UTCTime+unixEpoch = Time.UTCTime (Time.ModifiedJulianDay 40587) 0++hush :: Either x a -> Maybe a+hush = either (const Nothing) Just newtype Age = Age Int.Int8
witch.cabal view
@@ -1,7 +1,7 @@ cabal-version: 2.2 name: witch-version: 0.3.2.1+version: 0.3.2.2 synopsis: Convert values from one type into another. description: Witch converts values from one type into another. @@ -74,7 +74,7 @@ import: basics build-depends:- , hspec >= 2.7.9 && < 2.9+ , HUnit >= 1.6.2 && < 1.7 , witch ghc-options: -rtsopts