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 +25/−0
- src/lib/Witch/Instances.hs +52/−26
- src/lib/Witch/Utility.hs +4/−14
- src/test/Main.hs +1883/−1863
- witch.cabal +11/−2
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