aboutsummaryrefslogtreecommitdiffstats
path: root/tests/ApproxEq.hs
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-02-21 14:18:13 +0100
committertv <tv@krebsco.de>2026-02-21 22:22:17 +0100
commit55d42f1dd83b428aa0f1352bc0ea1402b9c2b811 (patch)
tree81d5e80b385de42a0d1b48d3edd0d2b66d858b2d /tests/ApproxEq.hs
generate initial commit
Generate haskell-http-client from running g4f v-7.1.4. Server started like this: python -m g4f --port 8080 --debug Code generated like this: openapi-generator-cli generate \ -i http://localhost:8080/openapi.json \ -g haskell-http-client \ --skip-validate-spec \ -o g4f-client \ --additional-properties=cabalPackage=g4f-client,cabalVersion=7.1.4,baseModule=G4fApi
Diffstat (limited to 'tests/ApproxEq.hs')
-rw-r--r--tests/ApproxEq.hs81
1 files changed, 81 insertions, 0 deletions
diff --git a/tests/ApproxEq.hs b/tests/ApproxEq.hs
new file mode 100644
index 0000000..88ca211
--- /dev/null
+++ b/tests/ApproxEq.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE DefaultSignatures #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeOperators #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+
+module ApproxEq where
+
+import Data.Text (Text)
+import Data.Time.Clock
+import Test.QuickCheck
+import GHC.Generics as G
+
+(==~)
+ :: (ApproxEq a, Show a)
+ => a -> a -> Property
+a ==~ b = counterexample (show a ++ " !=~ " ++ show b) (a =~ b)
+
+class GApproxEq f where
+ gApproxEq :: f a -> f a -> Bool
+
+instance GApproxEq U1 where
+ gApproxEq U1 U1 = True
+
+instance (GApproxEq a, GApproxEq b) =>
+ GApproxEq (a :+: b) where
+ gApproxEq (L1 a) (L1 b) = gApproxEq a b
+ gApproxEq (R1 a) (R1 b) = gApproxEq a b
+ gApproxEq _ _ = False
+
+instance (GApproxEq a, GApproxEq b) =>
+ GApproxEq (a :*: b) where
+ gApproxEq (a1 :*: b1) (a2 :*: b2) = gApproxEq a1 a2 && gApproxEq b1 b2
+
+instance (ApproxEq a) =>
+ GApproxEq (K1 i a) where
+ gApproxEq (K1 a) (K1 b) = a =~ b
+
+instance (GApproxEq f) =>
+ GApproxEq (M1 i t f) where
+ gApproxEq (M1 a) (M1 b) = gApproxEq a b
+
+class ApproxEq a where
+ (=~) :: a -> a -> Bool
+ default (=~) :: (Generic a, GApproxEq (Rep a)) => a -> a -> Bool
+ a =~ b = gApproxEq (G.from a) (G.from b)
+
+instance ApproxEq Text where
+ (=~) = (==)
+
+instance ApproxEq Char where
+ (=~) = (==)
+
+instance ApproxEq Bool where
+ (=~) = (==)
+
+instance ApproxEq Int where
+ (=~) = (==)
+
+instance ApproxEq Double where
+ (=~) = (==)
+
+instance ApproxEq a =>
+ ApproxEq (Maybe a)
+
+instance ApproxEq UTCTime where
+ (=~) = (==)
+
+instance ApproxEq a =>
+ ApproxEq [a] where
+ as =~ bs = and (zipWith (=~) as bs)
+
+instance (ApproxEq l, ApproxEq r) =>
+ ApproxEq (Either l r) where
+ Left a =~ Left b = a =~ b
+ Right a =~ Right b = a =~ b
+ _ =~ _ = False
+
+instance (ApproxEq l, ApproxEq r) =>
+ ApproxEq (l, r) where
+ (=~) (l1, r1) (l2, r2) = l1 =~ l2 && r1 =~ r2