@@ -52,6 +52,13 @@ lift fn q = (scalar' <<< fn) <$> toScalar' q
5252lift2 ∷ (Decimal → Decimal → Decimal ) → Quantity → Quantity → Result
5353lift2 fn q1 q2 = scalar' <$> (fn <$> toScalar' q1 <*> toScalar' q2)
5454
55+ lift2' ∷ (Decimal → Decimal → Decimal ) → Quantity → Quantity → Result
56+ lift2' f q1 q2 = do
57+ let u = derivedUnit q1
58+ v1 ← q1 `asValueIn'` u
59+ v2 ← q2 `asValueIn'` u
60+ pure $ quantity' (f v1 v2) u
61+
5562acos ∷ Quantity → Result
5663acos = lift Decimal .acos
5764
@@ -62,7 +69,7 @@ atan ∷ Quantity → Result
6269atan = lift Decimal .atan
6370
6471atan2 ∷ Quantity → Quantity → Result
65- atan2 = lift2 Decimal .atan2
72+ atan2 = lift2' Decimal .atan2
6673
6774cos ∷ Quantity → Result
6875cos = lift Decimal .cos
@@ -107,25 +114,13 @@ log10 ∷ Quantity → Result
107114log10 = lift Decimal .log10
108115
109116max2 ∷ Quantity → Quantity → Result
110- max2 q1 q2 = do
111- let u1 = derivedUnit q1
112- v1 ← q1 `asValueIn'` u1
113- v2 ← q2 `asValueIn'` u1
114- if v1 >= v2
115- then pure q1
116- else pure q2
117+ max2 = lift2' Decimal .max
117118
118119max ∷ NonEmptyList Quantity → Result
119120max xs = foldM max2 (head xs) (tail xs)
120121
121122min2 ∷ Quantity → Quantity → Result
122- min2 q1 q2 = do
123- let u1 = derivedUnit q1
124- v1 ← q1 `asValueIn'` u1
125- v2 ← q2 `asValueIn'` u1
126- if v1 <= v2
127- then pure q1
128- else pure q2
123+ min2 = lift2' Decimal .min
129124
130125min ∷ NonEmptyList Quantity → Result
131126min xs = foldM min2 (head xs) (tail xs)
@@ -136,12 +131,7 @@ mean xs = (_ ⊘ n) <$> foldM (⊕) (head xs) (tail xs)
136131 n = scalar' (Decimal .fromInt (length xs))
137132
138133modulo ∷ Quantity → Quantity → Result
139- modulo q1 q2 = do
140- let u = derivedUnit q1
141- v1 ← q1 `asValueIn'` u
142- v2 ← q2 `asValueIn'` u
143- let res = v1 `Decimal.modulo` v2
144- pure (quantity' res u)
134+ modulo = lift2' Decimal .modulo
145135
146136round ∷ Quantity → Result
147137round = lift Decimal .round
0 commit comments