circular-enum-0.1.0.0: src/Data/Enum/Circular.hs
{-|
Module : Data.Enum.Circular
Description : Circular successor & predecessor for bounded enum types
Copyright : (c) 2023 Mirko Westermeier
License : MIT
Sometimes, bounded enum types should be circular. Consider this enum
type of directions:
@
data Direction = North
| East
| South
| West
deriving (Eq, Enum, Bounded)
@
The 'Enum' instance allows for @succ North@ to be @East@ and @succ East@
to be @South@. But in this case, one would like to have some kind of
@succ@ with @succ West = North@ again. With 'Eq' and 'Bounded' instances,
the functions defined in this module act like circular versions of 'succ'
and 'pred'.
-}
module Data.Enum.Circular (csucc, cpred) where
-- | Circular version of 'succ'
csucc :: (Eq a, Enum a, Bounded a) => a -> a
csucc x | x == maxBound = minBound
| otherwise = succ x
-- | Circular version of 'pred'
cpred :: (Eq a, Enum a, Bounded a) => a -> a
cpred x | x == minBound = maxBound
| otherwise = pred x