packages feed

witch 0.3.4.1 → 0.3.4.2

raw patch · 5 files changed

+1975/−1905 lines, 5 filesPVP: minor bump suggested

API additions: PVP suggests at least a minor version bump

API changes (from Hackage documentation)

+ Witch.Instances: fromDigits :: [Int] -> Int -> (Integer, Integer)
+ Witch.Instances: makeRational :: Integer -> Integer -> Rational
+ Witch.Instances: overPositive :: (Eq a, Num a, Num b) => (a -> b) -> a -> b
+ Witch.Instances: realFloatToRational :: RealFloat s => s -> Either ArithException Rational

Files

src/lib/Witch.hs view
@@ -184,11 +184,36 @@   -- - You should not have both a @From@ instance and a @TryFrom@ instance for   --   the same pair of types.   --+  -- - If you have a @From@ or @TryFrom@ instance for a pair of types, then+  --   you should probably have a @From@ or @TryFrom@ instance for the same+  --   pair of types but in the opposite direction. In other words if you have+  --   @From a b@ then you should have @From b a@ or @TryFrom b a@.+  --   -- 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.++  -- ** Laws+  -- | As the previous section notes, there aren't any cut and dried laws for+  -- the @From@ and @TryFrom@ type classes. However it can be useful to+  -- consider the following equations for guiding instances:+  --+  -- > -- same strictness+  -- > seq (from @a @b x) y = seq x y+  -- > seq (tryFrom @a @b x) y = seq x y+  --+  -- > -- round trip+  -- > from @b @a (from @a @b x) = x+  --+  -- > -- transitive+  -- > from @b @c (from @a @b x) = from @a @c x+  -- > tryFrom @b @a (from @a @b x) = Right x+  -- > if isRight (tryFrom @a @b x) then+  -- >   fmap (from @b @a) (tryFrom @a @b x) = Right x+  -- > if isRight (tryFrom @a @b x) then do+  -- >   fmap (tryFrom @b @a) (tryFrom @a @b x) = Right (Right x)    -- ** Integral types   -- | There are a lot of types that represent various different ranges of
src/lib/Witch/Instances.hs view
@@ -17,6 +17,7 @@ import qualified Data.Int as Int import qualified Data.IntMap as IntMap import qualified Data.IntSet as IntSet+import qualified Data.List as List import qualified Data.List.NonEmpty as NonEmpty import qualified Data.Map as Map import qualified Data.Ratio as Ratio@@ -32,6 +33,7 @@ import qualified Data.Time.Clock.TAI as Time import qualified Data.Word as Word import qualified GHC.Float as Float+import qualified Numeric import qualified Numeric.Natural as Natural import qualified Witch.From as From import qualified Witch.TryFrom as TryFrom@@ -256,7 +258,8 @@   -- 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)+  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.@@ -631,9 +634,8 @@ -- | Uses 'fromIntegral' when the input is less than or equal to -- 9,007,199,254,740,991. instance TryFrom.TryFrom Word.Word64 Double where-  tryFrom = Utility.eitherTryFrom $ \s -> if s <= maxDouble-    then Right $ fromIntegral s-    else Left Exception.Overflow+  tryFrom = Utility.eitherTryFrom $ \s ->+    if s <= maxDouble then Right $ fromIntegral s else Left Exception.Overflow  -- Word @@ -748,9 +750,8 @@ -- | Uses 'fromIntegral' when the input is less than or equal to -- 9,007,199,254,740,991. instance TryFrom.TryFrom Natural.Natural Double where-  tryFrom = Utility.eitherTryFrom $ \s -> if s <= maxDouble-    then Right $ fromIntegral s-    else Left Exception.Overflow+  tryFrom = Utility.eitherTryFrom $ \s ->+    if s <= maxDouble then Right $ fromIntegral s else Left Exception.Overflow  -- Float @@ -808,13 +809,9 @@ instance TryFrom.TryFrom Float Natural.Natural where   tryFrom = Utility.tryVia @Integer --- | Uses 'toRational' when the input is not NaN or infinity.+-- | Uses 'Numeric.floatToDigits' when the input is not NaN or infinity. instance TryFrom.TryFrom Float Rational where-  tryFrom = Utility.eitherTryFrom $ \s -> if isNaN s-    then Left Exception.LossOfPrecision-    else if isInfinite s-      then if s > 0 then Left Exception.Overflow else Left Exception.Underflow-      else Right $ toRational s+  tryFrom = Utility.eitherTryFrom realFloatToRational  -- | Uses 'Float.float2Double'. instance From.From Float Double where@@ -876,13 +873,9 @@ instance TryFrom.TryFrom Double Natural.Natural where   tryFrom = Utility.tryVia @Integer --- | Uses 'toRational' when the input is not NaN or infinity.+-- | Uses 'Numeric.floatToDigits' when the input is not NaN or infinity. instance TryFrom.TryFrom Double Rational where-  tryFrom = Utility.eitherTryFrom $ \s -> if isNaN s-    then Left Exception.LossOfPrecision-    else if isInfinite s-      then if s > 0 then Left Exception.Overflow else Left Exception.Underflow-      else Right $ toRational s+  tryFrom = Utility.eitherTryFrom realFloatToRational  -- | Uses 'Float.double2Float'. This necessarily loses some precision. instance From.From Double Float where@@ -914,9 +907,7 @@     let       t :: Fixed.Fixed a       t = fromRational s-    in if toRational t == s-      then Right t-      else Left Exception.LossOfPrecision+    in if toRational t == s then Right t else Left Exception.LossOfPrecision  -- Fixed @@ -1032,11 +1023,17 @@  -- | Converts via 'Text.Text'. instance TryFrom.TryFrom ByteString.ByteString LazyText.Text where-  tryFrom = Utility.eitherTryFrom $ fmap (Utility.into @LazyText.Text) . Utility.tryInto @Text.Text+  tryFrom =+    Utility.eitherTryFrom+      $ fmap (Utility.into @LazyText.Text)+      . Utility.tryInto @Text.Text  -- | Converts via 'Text.Text'. instance TryFrom.TryFrom ByteString.ByteString String where-  tryFrom = Utility.eitherTryFrom $ fmap (Utility.into @String) . Utility.tryInto @Text.Text+  tryFrom =+    Utility.eitherTryFrom+      $ fmap (Utility.into @String)+      . Utility.tryInto @Text.Text  -- LazyByteString @@ -1058,11 +1055,17 @@  -- | Converts via 'LazyText.Text'. instance TryFrom.TryFrom LazyByteString.ByteString Text.Text where-  tryFrom = Utility.eitherTryFrom $ fmap (Utility.into @Text.Text) . Utility.tryInto @LazyText.Text+  tryFrom =+    Utility.eitherTryFrom+      $ fmap (Utility.into @Text.Text)+      . Utility.tryInto @LazyText.Text  -- | Converts via 'LazyText.Text'. instance TryFrom.TryFrom LazyByteString.ByteString String where-  tryFrom = Utility.eitherTryFrom $ fmap (Utility.into @String) . Utility.tryInto @LazyText.Text+  tryFrom =+    Utility.eitherTryFrom+      $ fmap (Utility.into @String)+      . Utility.tryInto @LazyText.Text  -- ShortByteString @@ -1248,6 +1251,29 @@ -- | Uses 'Time.zonedTimeToUTC'. instance From.From Time.ZonedTime Time.UTCTime where   from = Time.zonedTimeToUTC++--++realFloatToRational+  :: RealFloat s => s -> Either Exception.ArithException Rational+realFloatToRational s+  | isNaN s = Left Exception.LossOfPrecision+  | isInfinite s = if s > 0+    then Left Exception.Overflow+    else Left Exception.Underflow+  | otherwise = Right $ overPositive+    (uncurry makeRational . uncurry fromDigits . Numeric.floatToDigits 10)+    s++overPositive :: (Eq a, Num a, Num b) => (a -> b) -> a -> b+overPositive f x = if signum x == -1 then -(f (-x)) else f x++fromDigits :: [Int] -> Int -> (Integer, Integer)+fromDigits ds e =+  List.foldl' (\(a, n) d -> (a * 10 + toInteger d, n - 1)) (0, toInteger e) ds++makeRational :: Integer -> Integer -> Rational+makeRational d e = toRational d * 10 ^^ e  fromNonNegativeIntegral   :: (Integral s, Num t) => s -> Either Exception.ArithException t
src/lib/Witch/Utility.hs view
@@ -29,11 +29,7 @@ -- > -- > -- Prefer this: -- > into @t x-into-  :: forall target source-   . From.From source target-  => source-  -> target+into :: forall target source . From.From source target => source -> target into = From.from  -- | This function converts from some @source@ type into some @target@ type,@@ -48,9 +44,7 @@ -- > over @t f over   :: forall target source-   . ( From.From source target-     , From.From target source-     )+   . (From.From source target, From.From target source)   => (target -> target)   -> source   -> source@@ -68,9 +62,7 @@ -- > via @u via   :: forall through source target-   . ( From.From source through-     , From.From through target-     )+   . (From.From source through, From.From through target)   => source   -> target via = From.from . (\x -> x :: through) . From.from@@ -105,9 +97,7 @@ -- > tryVia @u tryVia   :: forall through source target-   . ( TryFrom.TryFrom source through-     , TryFrom.TryFrom through target-     )+   . (TryFrom.TryFrom source through, TryFrom.TryFrom through target)   => source   -> Either (TryFromException.TryFromException source target) target tryVia s = case TryFrom.tryFrom s of
src/test/Main.hs view
@@ -32,1869 +32,1889 @@ 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-      ]-    ]-  , "TryFromException" ~:-    [ "show" ~:-      [ show (Witch.TryFromException @Int @Int 0 Nothing) ~?= "TryFromException @Int @Int 0 Nothing"-      , show (Witch.TryFromException @(Seq.Seq Int) @(Seq.Seq Int) (Seq.fromList []) (Just (Exception.toException Exception.Overflow))) ~?= "TryFromException @(Seq Int) @(Seq Int) (fromList []) (Just arithmetic overflow)"-      ]-    ]-  , "Instances" ~:-    [ "From a a" ~:-      let f = Witch.from @Int @Int in-      [ f 0 ~?= 0-      ]--    -- Int8--    , "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)-      ]--    -- Int16--    , "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)-      ]--    -- Int32--    , "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)-      ]--    -- Int64--    , "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-      ]--    -- Int--    , "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)-      ]--    -- Integer--    , "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-      ]--    -- Word8--    , "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-      ]--    -- Word16--    , "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-      ]--    -- Word32--    , "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-      ]--    -- Word64--    , "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-      ]--    -- Word--    , "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)-      ]--    -- Natural--    , "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-      ]--    -- Float--    , "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)-      ]--    -- Double--    , "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)-      ]--    -- Ratio--    , "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)-      ]-    , "TryFrom Rational (Fixed a)" ~:-      let f = hush . Witch.tryFrom @Rational @Fixed.Deci in-      [ hush (Witch.tryFrom @Rational @Fixed.Uni 1) ~?= Just 1-      , hush (Witch.tryFrom @Rational @Fixed.Uni 1.2) ~?= Nothing-      , f 0.1 ~?= Just 0.1-      , f 1.2 ~?= Just 1.2-      , f 12.3 ~?= Just 12.3-      , f 0.12 ~?= Nothing-      ]--    -- Fixed--    , "From Integer (Fixed a)" ~:-      let f = Witch.from @Integer @Fixed.Deci in-      [ Witch.from @Integer @Fixed.Uni 1 ~?= 1-      , f 1 ~?= 0.1-      , f 10 ~?= 1-      , f 120 ~?= 12-      ]-    , "From (Fixed a) Integer" ~:-      let f = Witch.from @Fixed.Deci @Integer in-      [ Witch.from @Fixed.Uni @Integer 1 ~?= 1-      , f 0.1 ~?= 1-      , f 1 ~?= 10-      , f 12 ~?= 120-      ]-    , "From (Fixed a) Rational" ~:-      let f = Witch.from @Fixed.Deci @Rational in-      [ Witch.from @Fixed.Uni @Rational 1 ~?= 1-      , f 0.1 ~?= 0.1-      , f 1 ~?= 1-      , f 12 ~?= 12-      ]--    -- Complex--    , "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-      ]--    -- NonEmpty--    , "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]-      ]--    -- Set--    , "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']-      ]--    -- IntSet--    , "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]-      ]--    -- Map--    , "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)]-      ]--    -- IntMap--    , "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')]-      ]--    -- Seq--    , "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]-      ]--    -- ByteString--    , "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-      ]-    , "TryFrom ByteString LazyText" ~:-      let f = hush . Witch.tryFrom @ByteString.ByteString @LazyText.Text in-      [ f (ByteString.pack []) ~?= Just (LazyText.pack "")-      , f (ByteString.pack [0x61]) ~?= Just (LazyText.pack "a")-      , f (ByteString.pack [0xff]) ~?= Nothing-      ]-    , "TryFrom ByteString String" ~:-      let f = hush . Witch.tryFrom @ByteString.ByteString @String in-      [ f (ByteString.pack []) ~?= Just ""-      , f (ByteString.pack [0x61]) ~?= Just "a"-      , f (ByteString.pack [0xff]) ~?= Nothing-      ]--    -- LazyByteString--    , "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-      ]-    , "TryFrom LazyByteString Text" ~:-      let f = hush . Witch.tryFrom @LazyByteString.ByteString @Text.Text in-      [ f (LazyByteString.pack []) ~?= Just (Text.pack "")-      , f (LazyByteString.pack [0x61]) ~?= Just (Text.pack "a")-      , f (LazyByteString.pack [0xff]) ~?= Nothing-      ]-    , "TryFrom LazyByteString String" ~:-      let f = hush . Witch.tryFrom @LazyByteString.ByteString @String in-      [ f (LazyByteString.pack []) ~?= Just ""-      , f (LazyByteString.pack [0x61]) ~?= Just "a"-      , f (LazyByteString.pack [0xff]) ~?= Nothing-      ]--    -- ShortByteString--    , "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]-      ]--    -- Text--    , "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 Text LazyByteString" ~:-      let f = Witch.from @Text.Text @LazyByteString.ByteString in-      [ f (Text.pack "") ~?= LazyByteString.pack []-      , f (Text.pack "a") ~?= LazyByteString.pack [0x61]-      ]--    -- LazyText--    , "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 LazyText ByteString" ~:-      let f = Witch.from @LazyText.Text @ByteString.ByteString in-      [ f (LazyText.pack "") ~?= ByteString.pack []-      , f (LazyText.pack "a") ~?= ByteString.pack [0x61]-      ]--    -- String--    , "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 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 String ByteString" ~:-      let f = Witch.from @String @ByteString.ByteString in-      [ f "" ~?= ByteString.pack []-      , f "a" ~?= ByteString.pack [0x61]-      ]-    , "From String LazyByteString" ~:-      let f = Witch.from @String @LazyByteString.ByteString in-      [ f "" ~?= LazyByteString.pack []-      , f "a" ~?= LazyByteString.pack [0x61]-      ]--    -- Day--    , "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-      ]--    -- DayOfWeek--    , "From Day DayOfWeek" ~:-      let f = Witch.from @Time.Day @Time.DayOfWeek in-      [ f (Time.ModifiedJulianDay 0) ~?= Time.Wednesday-      ]--    -- UniversalTime--    , "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-      ]--    -- DiffTime--    , "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-      ]--    -- NominalDiffTime--    , "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-      ]--    -- POSIXTime--    , "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-      ]--    -- SystemTime--    , "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-      ]--    -- TimeOfDay--    , "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-      ]--    -- CalendarDiffTime--    , "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-      ]--    -- ZonedTime--    , "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-      ]-    ]-  ]+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]+            ]+       , "TryFromException"+         ~: [ "show"+                ~: [ show (Witch.TryFromException @Int @Int 0 Nothing)+                     ~?= "TryFromException @Int @Int 0 Nothing"+                   , show+                       (Witch.TryFromException @(Seq.Seq Int) @(Seq.Seq Int)+                         (Seq.fromList [])+                         (Just (Exception.toException Exception.Overflow))+                       )+                     ~?= "TryFromException @(Seq Int) @(Seq Int) (fromList []) (Just arithmetic overflow)"+                   ]+            ]+       , "Instances"+         ~: [ "From a a" ~: let f = Witch.from @Int @Int in [f 0 ~?= 0]++    -- Int8+            , "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)]++    -- Int16+            , "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)]++    -- Int32+            , "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)+                   ]++    -- Int64+            , "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+                   ]++    -- Int+            , "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)+                   ]++    -- Integer+            , "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+                   ]++    -- Word8+            , "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]++    -- Word16+            , "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]++    -- Word32+            , "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]++    -- Word64+            , "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+                   ]++    -- Word+            , "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)+                   ]++    -- Natural+            , "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+                   ]++    -- Float+            , "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+                   , f 0.1 ~?= Just 0.1+                   , f (-0.1) ~?= Just (-0.1)+                   ]+            , "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)+                   ]++    -- Double+            , "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+                   , f 0.1 ~?= Just 0.1+                   , f (-0.1) ~?= Just (-0.1)+                   ]+            , "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)+                   ]++    -- Ratio+            , "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)+                   , f 0.1 ~?= 0.1+                   , f (-0.1) ~?= (-0.1)+                   ]+            , "From Rational Double"+              ~: let f = Witch.from @Rational @Double+                 in+                   [ f 0 ~?= 0+                   , f 0.5 ~?= 0.5+                   , f (-0.5) ~?= (-0.5)+                   , f 0.1 ~?= 0.1+                   , f (-0.1) ~?= (-0.1)+                   ]+            , "TryFrom Rational (Fixed a)"+              ~: let f = hush . Witch.tryFrom @Rational @Fixed.Deci+                 in+                   [ hush (Witch.tryFrom @Rational @Fixed.Uni 1) ~?= Just 1+                   , hush (Witch.tryFrom @Rational @Fixed.Uni 1.2) ~?= Nothing+                   , f 0.1 ~?= Just 0.1+                   , f 1.2 ~?= Just 1.2+                   , f 12.3 ~?= Just 12.3+                   , f 0.12 ~?= Nothing+                   ]++    -- Fixed+            , "From Integer (Fixed a)"+              ~: let f = Witch.from @Integer @Fixed.Deci+                 in+                   [ Witch.from @Integer @Fixed.Uni 1 ~?= 1+                   , f 1 ~?= 0.1+                   , f 10 ~?= 1+                   , f 120 ~?= 12+                   ]+            , "From (Fixed a) Integer"+              ~: let f = Witch.from @Fixed.Deci @Integer+                 in+                   [ Witch.from @Fixed.Uni @Integer 1 ~?= 1+                   , f 0.1 ~?= 1+                   , f 1 ~?= 10+                   , f 12 ~?= 120+                   ]+            , "From (Fixed a) Rational"+              ~: let f = Witch.from @Fixed.Deci @Rational+                 in+                   [ Witch.from @Fixed.Uni @Rational 1 ~?= 1+                   , f 0.1 ~?= 0.1+                   , f 1 ~?= 1+                   , f 12 ~?= 12+                   ]++    -- Complex+            , "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+                   ]++    -- NonEmpty+            , "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]+                   ]++    -- Set+            , "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']+                   ]++    -- IntSet+            , "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]+                   ]++    -- Map+            , "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)]+                   ]++    -- IntMap+            , "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')]+                   ]++    -- Seq+            , "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]+                   ]++    -- ByteString+            , "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+                   ]+            , "TryFrom ByteString LazyText"+              ~: let+                   f =+                     hush . Witch.tryFrom @ByteString.ByteString @LazyText.Text+                 in+                   [ f (ByteString.pack []) ~?= Just (LazyText.pack "")+                   , f (ByteString.pack [0x61]) ~?= Just (LazyText.pack "a")+                   , f (ByteString.pack [0xff]) ~?= Nothing+                   ]+            , "TryFrom ByteString String"+              ~: let f = hush . Witch.tryFrom @ByteString.ByteString @String+                 in+                   [ f (ByteString.pack []) ~?= Just ""+                   , f (ByteString.pack [0x61]) ~?= Just "a"+                   , f (ByteString.pack [0xff]) ~?= Nothing+                   ]++    -- LazyByteString+            , "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+                   ]+            , "TryFrom LazyByteString Text"+              ~: let+                   f =+                     hush . Witch.tryFrom @LazyByteString.ByteString @Text.Text+                 in+                   [ f (LazyByteString.pack []) ~?= Just (Text.pack "")+                   , f (LazyByteString.pack [0x61]) ~?= Just (Text.pack "a")+                   , f (LazyByteString.pack [0xff]) ~?= Nothing+                   ]+            , "TryFrom LazyByteString String"+              ~: let+                   f = hush . Witch.tryFrom @LazyByteString.ByteString @String+                 in+                   [ f (LazyByteString.pack []) ~?= Just ""+                   , f (LazyByteString.pack [0x61]) ~?= Just "a"+                   , f (LazyByteString.pack [0xff]) ~?= Nothing+                   ]++    -- ShortByteString+            , "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]+                   ]++    -- Text+            , "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 Text LazyByteString"+              ~: let f = Witch.from @Text.Text @LazyByteString.ByteString+                 in+                   [ f (Text.pack "") ~?= LazyByteString.pack []+                   , f (Text.pack "a") ~?= LazyByteString.pack [0x61]+                   ]++    -- LazyText+            , "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 LazyText ByteString"+              ~: let f = Witch.from @LazyText.Text @ByteString.ByteString+                 in+                   [ f (LazyText.pack "") ~?= ByteString.pack []+                   , f (LazyText.pack "a") ~?= ByteString.pack [0x61]+                   ]++    -- String+            , "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 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 String ByteString"+              ~: let f = Witch.from @String @ByteString.ByteString+                 in+                   [ f "" ~?= ByteString.pack []+                   , f "a" ~?= ByteString.pack [0x61]+                   ]+            , "From String LazyByteString"+              ~: let f = Witch.from @String @LazyByteString.ByteString+                 in+                   [ f "" ~?= LazyByteString.pack []+                   , f "a" ~?= LazyByteString.pack [0x61]+                   ]++    -- Day+            , "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]++    -- DayOfWeek+            , "From Day DayOfWeek"+              ~: let f = Witch.from @Time.Day @Time.DayOfWeek+                 in [f (Time.ModifiedJulianDay 0) ~?= Time.Wednesday]++    -- UniversalTime+            , "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]++    -- DiffTime+            , "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]++    -- NominalDiffTime+            , "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]++    -- POSIXTime+            , "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]++    -- SystemTime+            , "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]++    -- TimeOfDay+            , "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]++    -- CalendarDiffTime+            , "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]++    -- ZonedTime+            , "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
witch.cabal view
@@ -1,7 +1,7 @@ cabal-version: 2.2  name: witch-version: 0.3.4.1+version: 0.3.4.2 synopsis: Convert values from one type into another. description: Witch converts values from one type into another. @@ -16,6 +16,11 @@   location: https://github.com/tfausak/witch   type: git +flag pedantic+  default: False+  description: Enables @-Werror@, which turns warnings into errors.+  manual: True+ common basics   build-depends:     , base >= 4.10.0 && < 4.17@@ -46,10 +51,14 @@     ghc-options:       -Wno-missing-safe-haskell-mode       -Wno-prepositive-qualified-module-      +   if impl(ghc >= 9.2)     ghc-options:       -Wno-missing-kind-signatures++  if flag(pedantic)+    ghc-options:+      -Werror  library   import: basics