{-# LANGUAGE MonadComprehensions #-}

module Test.PartialSemigroup
  ( assoc
  ) where

-- partial-semigroup
import Data.PartialSemigroup

-- hedgehog
import Hedgehog

-- base
import Control.Monad (mzero)

{- | The partial semigroup associativity axiom:

For all @x@, @y@, @z@ such that @appendMaybe x y = Just xy@ and
@appendMaybe y z = Just yx@, @appendMaybe x yz = appendMaybe xy z@. -}

assoc :: (PartialSemigroup a, Eq a, Show a) => Gen a -> Property
assoc gen = property $ do

  x <- forAll gen
  y <- forAll gen
  z <- forAll gen

  xy <- maybe mzero pure (appendMaybe x y)
  yz <- maybe mzero pure (appendMaybe y z)

  appendMaybe x yz === appendMaybe xy z