mediabus-0.3.2.0: src/Data/MediaBus/Basics/Monotone.hs
module Data.MediaBus.Basics.Monotone
( LocalOrd(..)
) where
import Data.Int
import Data.Word
-- | Class of numbers that are monotone increasing having only a relative order,
-- that is not necessarily transitive.
--
-- For example, a series of 'Word8' values: @0 64 128 192 0 64 128 ...@ could be
-- interpreted as a monotone series of consecutive increasing values, that wrap
-- around after 255. But note that the 'Ord' instance is not sufficient to
-- express that @0@ `succeeds` @192@, since 'Ord' ensures complete transitivity
-- and therefore @0 < 192@.
class LocalOrd a where
succeeds :: a -> a -> Bool
instance LocalOrd Word8 where
x `succeeds` y =
let d = x - y
in d > 0 && d <= ((maxBound - minBound) `div` 2)
instance LocalOrd Word16 where
x `succeeds` y =
let d = x - y
in d > 0 && d <= ((maxBound - minBound) `div` 2)
instance LocalOrd Word32 where
x `succeeds` y =
let d = x - y
in d > 0 && d <= ((maxBound - minBound) `div` 2)
instance LocalOrd Word64 where
x `succeeds` y =
let d = x - y
in d > 0 && d <= ((maxBound - minBound) `div` 2)
instance LocalOrd Int8 where
x `succeeds` y = x - y > 0
instance LocalOrd Int16 where
x `succeeds` y = x - y > 0
instance LocalOrd Int32 where
x `succeeds` y = x - y > 0
instance LocalOrd Int64 where
x `succeeds` y = x - y > 0
instance LocalOrd Int where
x `succeeds` y = x - y > 0