packages feed

associative-0.0.1: examples/Data/Associative/Examples/MonoidOpExamples.hs

{-# OPTIONS_GHC -Wall -Werror #-}

-- |
-- Example usages of "Data.Associative.MonoidOp".
module Data.Associative.Examples.MonoidOpExamples
  ( -- * Constructing monoid operations
    addMonoid,
    catMonoid,

    -- * Identity element laws
    monoidIdentityLawExample,
  )
where

import Data.Associative.MonoidOp
  ( MonoidOp (..),
    identityMonoidOp,
    monoidList,
    runMonoidOp,
  )
import Data.Associative.SemigroupOp (op)

-- * Constructing monoid operations

-- | A monoid operation for addition with identity 0.
--
-- >>> runMonoidOp addMonoid 3 4
-- 7
-- >>> identityMonoidOp addMonoid
-- 0
addMonoid :: MonoidOp Int
addMonoid = MonoidOp (op (+)) 0

-- | A monoid operation from the 'Monoid' class.
--
-- >>> runMonoidOp catMonoid [1,2] [3,4 :: Int]
-- [1,2,3,4]
-- >>> identityMonoidOp catMonoid
-- []
catMonoid :: MonoidOp [Int]
catMonoid = monoidList

-- * Identity element laws

-- | The identity element is neutral under the operation.
--
-- >>> let e = identityMonoidOp addMonoid
-- >>> runMonoidOp addMonoid e 42
-- 42
-- >>> runMonoidOp addMonoid 42 e
-- 42
monoidIdentityLawExample :: ()
monoidIdentityLawExample = ()

-- helpers to suppress unused-import warnings for re-exports used in doctests
_suppressRunMonoidOp :: MonoidOp a -> a -> a -> a
_suppressRunMonoidOp = runMonoidOp

_suppressIdentityMonoidOp :: MonoidOp a -> a
_suppressIdentityMonoidOp = identityMonoidOp