{-# Language MultiParamTypeClasses #-} {-# Language FlexibleInstances #-} -------------------------------------------------------------------------------- -- | -- Module : Data.EqZero -- Copyright : (C) 2017 Maksymilian Owsianny -- License : BSD-style (see LICENSE) -- Maintainer : Maksymilian.Owsianny@gmail.com -- -------------------------------------------------------------------------------- module Data.EqZero where import Protolude import Linear.Epsilon (nearZero) import Foreign.C (CFloat, CDouble) -------------------------------------------------------------------------------- -- | Convenient universal zero equality predicate that warps to zero within some -- epsilon for floating point numbers. class EqZero a where eqZero :: a -> Bool {- instance (Num a, Eq a) => EqZero Exact a where eqZero _ = (==0) instance Epsilon a => EqZero NonExact a where eqZero _ = nearZero -} -- | Greater or equal to zero predicate. geqZero :: (EqZero n, Ord n, Num n) => n -> Bool geqZero n = eqZero n || n > 0 instance EqZero Float where eqZero = nearZero instance EqZero Double where eqZero = nearZero instance EqZero CFloat where eqZero = nearZero instance EqZero CDouble where eqZero = nearZero instance EqZero Rational where eqZero = (==0)