monoid-extras-0.1.0.0: src/Data/Monoid/PosInf.hs
-----------------------------------------------------------------------------
-- |
-- Module : Data.Monoid.PosInf
-- Copyright : (c) 2012 diagrams-core team (see LICENSE)
-- License : BSD-style (see LICENSE)
-- Maintainer : diagrams-discuss@googlegroups.com
--
-- Make a semigroup under 'min' into a monoid by adjoining an element
-- corresponding to positive infinity.
--
-----------------------------------------------------------------------------
module Data.Monoid.PosInf
( PosInf(..)
, minimum
) where
import Data.Semigroup
import qualified Prelude as P
import Prelude hiding (minimum)
data PosInf a = Finite a | PosInfty
deriving (Eq, Ord, Show)
instance Ord a => Semigroup (PosInf a) where
(<>) = min
instance Ord a => Monoid (PosInf a) where
mempty = PosInfty
mappend = (<>)
minimum :: Ord a => [a] -> PosInf a
minimum xs = P.minimum (PosInfty : map Finite xs)