@@ -126,6 +126,7 @@ module Functora.Prelude
126
126
Fix (.. ),
127
127
FixNonNeg (.. ),
128
128
inspectFixed ,
129
+ inspectFix ,
129
130
130
131
-- * DerivingVia
131
132
-- $derivingVia
@@ -1213,7 +1214,7 @@ instance From Fix Rational where
1213
1214
from = via @ (Fixed E30 ) @ Fix @ Rational
1214
1215
1215
1216
newtype FixNonNeg = FixNonNeg
1216
- { unFixNonNeg :: Fixed E30
1217
+ { unFixNonNeg :: Fix
1217
1218
}
1218
1219
deriving stock
1219
1220
( Eq ,
@@ -1224,68 +1225,88 @@ newtype FixNonNeg = FixNonNeg
1224
1225
Generic
1225
1226
)
1226
1227
1227
- instance TryFrom (Fixed E30 ) FixNonNeg where
1228
- tryFrom src =
1228
+ mkViaFix ::
1229
+ forall a .
1230
+ ( From a Fix
1231
+ ) =>
1232
+ a ->
1233
+ Either (TryFromException a FixNonNeg ) FixNonNeg
1234
+ mkViaFix src =
1235
+ first (withSource src)
1236
+ . tryFrom @ Fix @ FixNonNeg
1237
+ $ from @ a @ Fix src
1238
+
1239
+ instance TryFrom Fix FixNonNeg where
1240
+ tryFrom src = do
1229
1241
if src >= 0
1230
1242
then pure $ FixNonNeg src
1231
1243
else Left . TryFromException src . Just $ SomeException Exception. Underflow
1232
1244
1245
+ instance TryFrom (Fixed E30 ) FixNonNeg where
1246
+ tryFrom = mkViaFix @ (Fixed E30 )
1247
+
1233
1248
instance TryFrom Integer FixNonNeg where
1234
- tryFrom src =
1235
- first (withSource src)
1236
- . tryFrom @ (Fixed E30 ) @ FixNonNeg
1237
- $ from @ Integer @ (Fixed E30 ) src
1249
+ tryFrom = mkViaFix @ Integer
1238
1250
1239
1251
instance TryFrom Natural FixNonNeg where
1240
- tryFrom src =
1241
- first (withSource src)
1242
- . tryFrom @ (Fixed E30 ) @ FixNonNeg
1243
- $ via @ Integer @ Natural @ (Fixed E30 ) src
1252
+ tryFrom = mkViaFix @ Natural
1244
1253
1245
1254
instance TryFrom Rational FixNonNeg where
1246
- tryFrom = tryVia @ ( Fixed E30 ) @ Rational @ FixNonNeg
1255
+ tryFrom = tryVia @ Fix @ Rational @ FixNonNeg
1247
1256
1248
1257
instance TryFrom Scientific FixNonNeg where
1249
- tryFrom src =
1250
- first (withSource src)
1251
- . tryFrom @ Rational @ FixNonNeg
1252
- $ toRational @ Scientific src
1258
+ tryFrom = tryVia @ Fix @ Scientific @ FixNonNeg
1253
1259
1254
- instance From FixNonNeg ( Fixed E30 ) where
1260
+ instance From FixNonNeg Fix where
1255
1261
from = unFixNonNeg
1256
1262
1263
+ instance From FixNonNeg (Fixed E30 ) where
1264
+ from = unFix . unFixNonNeg
1265
+
1257
1266
instance From FixNonNeg Rational where
1258
- from = via @ ( Fixed E30 ) @ FixNonNeg @ Rational
1267
+ from = via @ Fix @ FixNonNeg @ Rational
1259
1268
1260
1269
inspectFixed ::
1261
- forall a e .
1262
- ( From String a ,
1263
- HasResolution e
1270
+ forall str e .
1271
+ ( HasResolution e ,
1272
+ From String str
1264
1273
) =>
1265
1274
Fixed e ->
1266
- a
1275
+ str
1267
1276
inspectFixed =
1268
- from @ String @ a . showFixed True
1277
+ from @ String @ str
1278
+ . showFixed True
1279
+
1280
+ inspectFix ::
1281
+ forall str fix .
1282
+ ( From fix (Fixed E30 ),
1283
+ From String str
1284
+ ) =>
1285
+ fix ->
1286
+ str
1287
+ inspectFix =
1288
+ inspectFixed
1289
+ . from @ fix @ (Fixed E30 )
1269
1290
1270
1291
instance Num FixNonNeg where
1271
- lhs + rhs = unsafeFrom @ ( Fixed E30 ) @ FixNonNeg $ unFixNonNeg lhs + unFixNonNeg rhs
1272
- lhs - rhs = unsafeFrom @ ( Fixed E30 ) @ FixNonNeg $ unFixNonNeg lhs - unFixNonNeg rhs
1273
- lhs * rhs = unsafeFrom @ ( Fixed E30 ) @ FixNonNeg $ unFixNonNeg lhs * unFixNonNeg rhs
1274
- negate = unsafeFrom @ ( Fixed E30 ) @ FixNonNeg . negate . unFixNonNeg
1275
- abs = unsafeFrom @ ( Fixed E30 ) @ FixNonNeg . abs . unFixNonNeg
1276
- signum = unsafeFrom @ ( Fixed E30 ) @ FixNonNeg . signum . unFixNonNeg
1292
+ lhs + rhs = unsafeFrom @ Fix @ FixNonNeg $ unFixNonNeg lhs + unFixNonNeg rhs
1293
+ lhs - rhs = unsafeFrom @ Fix @ FixNonNeg $ unFixNonNeg lhs - unFixNonNeg rhs
1294
+ lhs * rhs = unsafeFrom @ Fix @ FixNonNeg $ unFixNonNeg lhs * unFixNonNeg rhs
1295
+ negate = unsafeFrom @ Fix @ FixNonNeg . negate . unFixNonNeg
1296
+ abs = unsafeFrom @ Fix @ FixNonNeg . abs . unFixNonNeg
1297
+ signum = unsafeFrom @ Fix @ FixNonNeg . signum . unFixNonNeg
1277
1298
fromInteger = unsafeFrom @ Integer @ FixNonNeg
1278
1299
1279
1300
instance Real FixNonNeg where
1280
1301
toRational = toRational . unFixNonNeg
1281
1302
1282
1303
instance Fractional FixNonNeg where
1283
1304
fromRational = unsafeFrom @ Rational @ FixNonNeg
1284
- lhs / rhs = unsafeFrom @ ( Fixed E30 ) @ FixNonNeg $ unFixNonNeg lhs / unFixNonNeg rhs
1305
+ lhs / rhs = unsafeFrom @ Fix @ FixNonNeg $ unFixNonNeg lhs / unFixNonNeg rhs
1285
1306
1286
1307
instance RealFrac FixNonNeg where
1287
1308
properFraction x =
1288
- (lhs, unsafeFrom @ ( Fixed E30 ) @ FixNonNeg rhs)
1309
+ (lhs, unsafeFrom @ Fix @ FixNonNeg rhs)
1289
1310
where
1290
1311
(lhs, rhs) = properFraction $ unFixNonNeg x
1291
1312
0 commit comments