@@ -119,6 +119,12 @@ module Functora.Prelude
119
119
dropAround ,
120
120
dropWhileEnd ,
121
121
AscOrDesc (.. ),
122
+
123
+ -- * FixedPoint
124
+ -- $fixedPoint
125
+ Fix (.. ),
126
+ FixNonNeg ,
127
+ mkFixNonNeg ,
122
128
E30 ,
123
129
124
130
-- * DerivingVia
@@ -1152,11 +1158,70 @@ data AscOrDesc
1152
1158
Bounded
1153
1159
)
1154
1160
1161
+ -- $fixedPoint
1162
+ -- Fixed point numbers.
1163
+
1155
1164
data E30
1156
1165
1157
1166
instance HasResolution E30 where
1158
1167
resolution = const 1_0000000000_0000000000_0000000000
1159
1168
1169
+ newtype Fix = Fix
1170
+ { unFix :: Fixed E30
1171
+ }
1172
+ deriving stock
1173
+ ( Eq ,
1174
+ Ord ,
1175
+ Show ,
1176
+ Data ,
1177
+ Generic
1178
+ )
1179
+ deriving newtype
1180
+ ( Num ,
1181
+ Real ,
1182
+ Fractional ,
1183
+ RealFrac
1184
+ )
1185
+
1186
+ newtype FixNonNeg = FixNonNeg
1187
+ { unFixNonNeg :: Fixed E30
1188
+ }
1189
+ deriving stock
1190
+ ( Eq ,
1191
+ Ord ,
1192
+ Show ,
1193
+ Data ,
1194
+ Generic
1195
+ )
1196
+
1197
+ mkFixNonNeg :: Fixed E30 -> FixNonNeg
1198
+ mkFixNonNeg x =
1199
+ if x >= 0
1200
+ then FixNonNeg x
1201
+ else error $ " Underflow " <> inspect x
1202
+
1203
+ instance Num FixNonNeg where
1204
+ lhs + rhs = mkFixNonNeg $ unFixNonNeg lhs + unFixNonNeg rhs
1205
+ lhs - rhs = mkFixNonNeg $ unFixNonNeg lhs - unFixNonNeg rhs
1206
+ lhs * rhs = mkFixNonNeg $ unFixNonNeg lhs * unFixNonNeg rhs
1207
+ negate = mkFixNonNeg . negate . unFixNonNeg
1208
+ abs = mkFixNonNeg . abs . unFixNonNeg
1209
+ signum = mkFixNonNeg . signum . unFixNonNeg
1210
+ fromInteger = mkFixNonNeg . Prelude. fromInteger @ (Fixed E30 )
1211
+
1212
+ instance Real FixNonNeg where
1213
+ toRational = toRational . unFixNonNeg
1214
+
1215
+ instance Fractional FixNonNeg where
1216
+ fromRational = mkFixNonNeg . fromRational
1217
+ lhs / rhs = mkFixNonNeg $ unFixNonNeg lhs / unFixNonNeg rhs
1218
+
1219
+ instance RealFrac FixNonNeg where
1220
+ properFraction x =
1221
+ (lhs, mkFixNonNeg rhs)
1222
+ where
1223
+ (lhs, rhs) = properFraction $ unFixNonNeg x
1224
+
1160
1225
-- $derivingVia
1161
1226
-- Newtypes to simplify deriving via.
1162
1227
-- We have to expose default constructors/accessors
0 commit comments