mirror of
https://github.com/OpenAPITools/openapi-generator.git
synced 2025-05-13 21:20:56 +00:00
82 lines
1.9 KiB
Haskell
82 lines
1.9 KiB
Haskell
{-# 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
|