fixed

Pure Haskell large fixed-width integers.
git clone git://git.ppad.tech/fixed.git
Log | Files | Refs | README | LICENSE

commit 488d2204a44b4bbc181c3a6e3ae3381e83c20aa5
parent 691765b1d70272bc4fc2edac4a5137a1ae6f8255
Author: Jared Tobin <jared@jtobin.io>
Date:   Sat, 22 Nov 2025 07:37:22 +0400

lib: add missing strictness, eq for mont

Diffstat:
Mlib/Data/Word/Wide.hs | 2+-
Mlib/Data/Word/Wider.hs | 2+-
Mlib/Numeric/Montgomery/Secp256k1/Curve.hs | 6+++++-
Mlib/Numeric/Montgomery/Secp256k1/Scalar.hs | 6+++++-
4 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/lib/Data/Word/Wide.hs b/lib/Data/Word/Wide.hs @@ -59,7 +59,7 @@ fi = fromIntegral -- wide words ----------------------------------------------------------------- -- | Little-endian wide words. -data Wide = Wide (# Word#, Word# #) +data Wide = Wide !(# Word#, Word# #) get_lo# :: (# Word#, Word# #) -> Word# get_lo# (# l, _ #) = l diff --git a/lib/Data/Word/Wider.hs b/lib/Data/Word/Wider.hs @@ -29,7 +29,7 @@ wrapping_neg# w = plusWord# (not# w) 1## -- wider words ---------------------------------------------------------------- -- | Little-endian wider words. -data Wider = Wider (# Word#, Word#, Word#, Word# #) +data Wider = Wider !(# Word#, Word#, Word#, Word# #) instance Show Wider where show (Wider (# a, b, c, d #)) = diff --git a/lib/Numeric/Montgomery/Secp256k1/Curve.hs b/lib/Numeric/Montgomery/Secp256k1/Curve.hs @@ -9,6 +9,7 @@ module Numeric.Montgomery.Secp256k1.Curve where import Control.DeepSeq +import qualified Data.Choice as C import qualified Data.Word.Limb as L import qualified Data.Word.Wide as W import Data.Word.Wider (Wider(..)) @@ -19,11 +20,14 @@ import Prelude hiding (div, mod, or, and, not, quot, rem, recip) -- montgomery arithmetic, specialized to the secp256k1 field prime modulus -- 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F -data Montgomery = Montgomery (# Word#, Word#, Word#, Word# #) +data Montgomery = Montgomery !(# Word#, Word#, Word#, Word# #) instance NFData Montgomery where rnf (Montgomery a) = case a of (# _, _, _, _ #) -> () +instance Eq Montgomery where + Montgomery a == Montgomery b = C.decide (C.ct_eq_wider# a b) + -- XX define constants here, current approach is fragile -- utilities ------------------------------------------------------------------ diff --git a/lib/Numeric/Montgomery/Secp256k1/Scalar.hs b/lib/Numeric/Montgomery/Secp256k1/Scalar.hs @@ -9,6 +9,7 @@ module Numeric.Montgomery.Secp256k1.Scalar where import Control.DeepSeq +import qualified Data.Choice as C import qualified Data.Word.Limb as L import qualified Data.Word.Wide as W import Data.Word.Wider (Wider(..)) @@ -19,11 +20,14 @@ import Prelude hiding (div, mod, or, and, not, quot, rem, recip) -- montgomery arithmetic, specialized to the secp256k1 scalar group order -- 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 -data Montgomery = Montgomery (# Word#, Word#, Word#, Word# #) +data Montgomery = Montgomery !(# Word#, Word#, Word#, Word# #) instance NFData Montgomery where rnf (Montgomery a) = case a of (# _, _, _, _ #) -> () +instance Eq Montgomery where + Montgomery a == Montgomery b = C.decide (C.ct_eq_wider# a b) + -- XX define constants here, current approach is fragile -- utilities ------------------------------------------------------------------