packages feed

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

{-# OPTIONS_GHC -Wall -Werror #-}

-- |
-- Example usages of "Data.Associative.PartialMonoidOp".
module Data.Associative.Examples.PartialMonoidOpExamples
  ( -- * Constructing partial monoid operations
    addPartialMonoid,
    catPartialMonoid,

    -- * Identity element laws
    partialMonoidIdentityLawExample,
  )
where

import Data.Associative.PartialMonoidOp
  ( PartialMonoidOp (..),
    identityPartialMonoidOp,
    pmonoidList,
    runPartialMonoidOp,
  )
import Data.Associative.PartialSemigroupOp (total)

-- * Constructing partial monoid operations

-- | A partial monoid operation for addition with identity 0.
--
-- >>> runPartialMonoidOp addPartialMonoid 3 4
-- Just 7
-- >>> identityPartialMonoidOp addPartialMonoid
-- 0
addPartialMonoid :: PartialMonoidOp Int
addPartialMonoid = PartialMonoidOp (total (+)) 0

-- | A partial monoid operation from the 'Monoid' class.
--
-- >>> runPartialMonoidOp catPartialMonoid [1,2] [3,4 :: Int]
-- Just [1,2,3,4]
-- >>> identityPartialMonoidOp catPartialMonoid
-- []
catPartialMonoid :: PartialMonoidOp [Int]
catPartialMonoid = pmonoidList

-- * Identity element laws

-- | The identity element is neutral under the operation.
--
-- >>> let e = identityPartialMonoidOp addPartialMonoid
-- >>> runPartialMonoidOp addPartialMonoid e 42
-- Just 42
-- >>> runPartialMonoidOp addPartialMonoid 42 e
-- Just 42
partialMonoidIdentityLawExample :: ()
partialMonoidIdentityLawExample = ()

-- helpers to suppress unused-import warnings for re-exports used in doctests
_suppressRunPartialMonoidOp :: PartialMonoidOp a -> a -> a -> Maybe a
_suppressRunPartialMonoidOp = runPartialMonoidOp

_suppressIdentityPartialMonoidOp :: PartialMonoidOp a -> a
_suppressIdentityPartialMonoidOp = identityPartialMonoidOp