packages feed

associative-0.0.4: 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',
    PartialMonoidOpT (..),
    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 = PartialMonoidOpT (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