packages feed

monoidmap-0.0.0.0: src/test/Data/MonoidMap/ExampleSpec.hs

{-# LANGUAGE OverloadedLists #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{- HLINT ignore "Redundant bracket" -}
{- HLINT ignore "Use camelCase" -}
{- HLINT ignore "Use null" -}

-- |
-- Copyright: © 2022–2023 Jonathan Knowles
-- License: Apache-2.0
--
module Data.MonoidMap.ExampleSpec
    where

import Prelude hiding
    ( gcd, lcm )

import Data.Function
    ( (&) )
import Data.Group
    ( Group (..) )
import Data.Monoid
    ( Product (..), Sum (..) )
import Data.Monoid.GCD
    ( GCDMonoid (..), LeftGCDMonoid (..), RightGCDMonoid (..) )
import Data.Monoid.LCM
    ( LCMMonoid (..) )
import Data.Monoid.Monus
    ( OverlappingGCDMonoid (..), (<\>) )
import Data.MonoidMap
    ( MonoidMap )
import Data.Ratio
    ( (%) )
import Data.Semigroup.Cancellative
    ( LeftReductive (..), RightReductive (..) )
import Data.Set
    ( Set )
import Numeric.Natural
    ( Natural )
import Test.Hspec
    ( Spec, describe )
import Test.Hspec.Unit
    ( UnitTestData1
    , UnitTestData2
    , unitTestData1
    , unitTestData2
    , unitTestSpec
    )
import Test.QuickCheck.Instances.Natural
    ()
import Test.QuickCheck.Instances.Text
    ()

import qualified Data.MonoidMap as MonoidMap
import qualified Data.Set as Set

spec :: Spec
spec = describe "Examples" $ do

    describe "Conversion" $ do

        exampleSpec_fromList_String
        exampleSpec_toList_String

    describe "Comparison" $ do

        exampleSpec_isSubmapOf_Sum_Natural
        exampleSpec_disjoint_Product_Natural
        exampleSpec_disjoint_Sum_Natural
        exampleSpec_disjoint_Set_Natural

    describe "Intersection" $ do

        exampleSpec_intersectionWith_min_Sum_Natural

    describe "Union" $ do

        exampleSpec_unionWith_max_Sum_Natural

    describe "Semigroup" $ do

        exampleSpec_Semigroup_mappend_String
        exampleSpec_Semigroup_mappend_Sum_Natural

    describe "Group" $ do

        exampleSpec_Group_invert_Product_Rational
        exampleSpec_Group_invert_Sum_Integer
        exampleSpec_Group_pow_Product_Rational
        exampleSpec_Group_pow_Sum_Integer
        exampleSpec_Group_subtract_Product_Rational
        exampleSpec_Group_subtract_Sum_Integer

    describe "Reductive" $ do

        exampleSpec_Reductive_isPrefixOf_String
        exampleSpec_Reductive_isPrefixOf_Sum_Natural
        exampleSpec_Reductive_isSuffixOf_String
        exampleSpec_Reductive_isSuffixOf_Sum_Natural
        exampleSpec_Reductive_stripPrefix_String
        exampleSpec_Reductive_stripPrefix_Sum_Natural
        exampleSpec_Reductive_stripSuffix_String
        exampleSpec_Reductive_stripSuffix_Sum_Natural

    describe "LeftGCDMonoid" $ do

        exampleSpec_LeftGCDMonoid_commonPrefix_String
        exampleSpec_LeftGCDMonoid_commonPrefix_Sum_Natural
        exampleSpec_LeftGCDMonoid_stripCommonPrefix_String
        exampleSpec_LeftGCDMonoid_stripCommonPrefix_Sum_Natural

    describe "RightGCDMonoid" $ do

        exampleSpec_RightGCDMonoid_commonSuffix_String
        exampleSpec_RightGCDMonoid_commonSuffix_Sum_Natural
        exampleSpec_RightGCDMonoid_stripCommonSuffix_String
        exampleSpec_RightGCDMonoid_stripCommonSuffix_Sum_Natural

    describe "OverlappingGCDMonoid" $ do

        exampleSpec_OverlappingGCDMonoid_overlap_String
        exampleSpec_OverlappingGCDMonoid_overlap_Sum_Natural
        exampleSpec_OverlappingGCDMonoid_stripPrefixOverlap_String
        exampleSpec_OverlappingGCDMonoid_stripPrefixOverlap_Sum_Natural
        exampleSpec_OverlappingGCDMonoid_stripSuffixOverlap_String
        exampleSpec_OverlappingGCDMonoid_stripSuffixOverlap_Sum_Natural

    describe "GCDMonoid" $ do

        exampleSpec_GCDMonoid_gcd_Product_Natural
        exampleSpec_GCDMonoid_gcd_Sum_Natural
        exampleSpec_GCDMonoid_gcd_Set_Natural

    describe "LCMMonoid" $ do

        exampleSpec_LCMMonoid_lcm_Product_Natural
        exampleSpec_LCMMonoid_lcm_Sum_Natural
        exampleSpec_LCMMonoid_lcm_Set_Natural

    describe "Monus" $ do

        exampleSpec_Monus_monus_Set_Natural
        exampleSpec_Monus_monus_Sum_Natural

--------------------------------------------------------------------------------
-- Conversion
--------------------------------------------------------------------------------

exampleSpec_fromList_String :: Spec
exampleSpec_fromList_String = unitTestSpec
    "MonoidMap.fromList (String)"
    "MonoidMap.fromList"
    (MonoidMap.fromList)
    (exampleData_fromList_String)

exampleData_fromList_String :: UnitTestData1
    [(Int, String)]
    (MonoidMap Int String)
exampleData_fromList_String = unitTestData1
    [ ( [(1, "a"), (2, "x"), (1, "b"), (2, "y"), (1, "c"), (2, "z")]
      , [(1, "abc"), (2, "xyz")]
      )
    ]

exampleSpec_toList_String :: Spec
exampleSpec_toList_String = unitTestSpec
    "MonoidMap.toList (String)"
    "MonoidMap.toList"
    (MonoidMap.toList)
    (exampleData_toList_String)

exampleData_toList_String :: UnitTestData1
    (MonoidMap Int String)
    [(Int, String)]
exampleData_toList_String = unitTestData1
    [ ( [(3, "z"), (2, "y"), (1, "x")]
      , [(1, "x"), (2, "y"), (3, "z")]
      )
    ]

--------------------------------------------------------------------------------
-- Comparison
--------------------------------------------------------------------------------

exampleSpec_isSubmapOf_Sum_Natural :: Spec
exampleSpec_isSubmapOf_Sum_Natural = unitTestSpec
    "MonoidMap.isSubmapOf (Sum Natural)"
    "MonoidMap.isSubmapOf"
    (MonoidMap.isSubmapOf)
    (exampleData_isSubmapOf_Sum_Natural)

exampleData_isSubmapOf_Sum_Natural :: UnitTestData2
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
    (Bool)
exampleData_isSubmapOf_Sum_Natural = unitTestData2
    [ ( m [0, 1, 2, 3]
      , m [4, 4, 4, 4]
      , True
      )
    , ( m [0, 1, 2, 3]
      , m [0, 4, 4, 4]
      , True
      )
    , ( m [0, 1, 2, 3]
      , m [0, 1, 4, 4]
      , True
      )
    , ( m [0, 1, 2, 3]
      , m [0, 1, 2, 4]
      , True
      )
    , ( m [0, 1, 2, 3]
      , m [0, 1, 2, 3]
      , True
      )
    , ( m [0, 1, 2, 3]
      , m [0, 0, 2, 3]
      , False
      )
    , ( m [0, 1, 2, 3]
      , m [0, 1, 1, 3]
      , False
      )
    , ( m [0, 1, 2, 3]
      , m [0, 1, 2, 2]
      , False
      )
    , ( m [0, 1, 2, 3]
      , m [0, 0, 0, 0]
      , False
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_disjoint_Product_Natural :: Spec
exampleSpec_disjoint_Product_Natural = unitTestSpec
    "MonoidMap.disjoint (Product Natural)"
    "MonoidMap.disjoint"
    (MonoidMap.disjoint)
    (exampleData_disjoint_Product_Natural)

exampleData_disjoint_Product_Natural :: UnitTestData2
    (MonoidMap LatinChar (Product Natural))
    (MonoidMap LatinChar (Product Natural))
    (Bool)
exampleData_disjoint_Product_Natural = unitTestData2
    [ ( m []
      , m []
      , True
      )
    , ( m [2, 3, 5, 7]
      , m [3, 5, 7, 2]
      , True
      )
    , ( m [2 * 3, 5 * 7]
      , m [5 * 7, 2 * 3]
      , True
      )
    , ( m [2 * 3    , 3 * 5    ]
      , m [    3 * 5,     5 * 7]
      , False
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_disjoint_Sum_Natural :: Spec
exampleSpec_disjoint_Sum_Natural = unitTestSpec
    "MonoidMap.disjoint (Sum Natural)"
    "MonoidMap.disjoint"
    (MonoidMap.disjoint)
    (exampleData_disjoint_Sum_Natural)

exampleData_disjoint_Sum_Natural :: UnitTestData2
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
    (Bool)
exampleData_disjoint_Sum_Natural = unitTestData2
    [ ( m []
      , m []
      , True
      )
    , ( m [0, 1, 0, 1]
      , m [1, 0, 1, 0]
      , True
      )
    , ( m [0, 8, 0, 8]
      , m [8, 0, 8, 0]
      , True
      )
    , ( m [0, 8, 0, 8]
      , m [8, 0, 8, 1]
      , False
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_disjoint_Set_Natural :: Spec
exampleSpec_disjoint_Set_Natural = unitTestSpec
    "MonoidMap.disjoint (Set Natural)"
    "MonoidMap.disjoint"
    (MonoidMap.disjoint)
    (exampleData_disjoint_Set_Natural)

exampleData_disjoint_Set_Natural :: UnitTestData2
    (MonoidMap LatinChar (Set Natural))
    (MonoidMap LatinChar (Set Natural))
    (Bool)
exampleData_disjoint_Set_Natural = unitTestData2
    [ ( m []
      , m []
      , True
      )
    , ( m [[1], [2], [3], [4]]
      , m [[5], [6], [7], [8]]
      , True
      )
    , ( m [[1, 2], [3, 4]]
      , m [[5, 6], [7, 8]]
      , True
      )
    , ( m [[1, 2   ], [3, 4   ]]
      , m [[   2, 3], [   4, 5]]
      , False
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..] . fmap Set.fromList

--------------------------------------------------------------------------------
-- Intersection
--------------------------------------------------------------------------------

exampleSpec_intersectionWith_min_Sum_Natural :: Spec
exampleSpec_intersectionWith_min_Sum_Natural = unitTestSpec
    "MonoidMap.intersectionWith (Sum Natural)"
    "MonoidMap.intersectionWith"
    (MonoidMap.intersectionWith min)
    (exampleData_intersectionWith_min_Sum_Natural)

exampleData_intersectionWith_min_Sum_Natural :: UnitTestData2
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
exampleData_intersectionWith_min_Sum_Natural = unitTestData2
    [ ( m [0, 1, 2, 3, 4, 5, 6, 7]
      , m [7, 6, 5, 4, 3, 2, 1, 0]
      , m [0, 1, 2, 3, 3, 2, 1, 0]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

--------------------------------------------------------------------------------
-- Union
--------------------------------------------------------------------------------

exampleSpec_unionWith_max_Sum_Natural :: Spec
exampleSpec_unionWith_max_Sum_Natural = unitTestSpec
    "MonoidMap.unionWith (Sum Natural)"
    "MonoidMap.unionWith"
    (MonoidMap.unionWith max)
    (exampleData_unionWith_max_Sum_Natural)

exampleData_unionWith_max_Sum_Natural :: UnitTestData2
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
exampleData_unionWith_max_Sum_Natural = unitTestData2
    [ ( m [0, 1, 2, 3, 4, 5, 6, 7]
      , m [7, 6, 5, 4, 3, 2, 1, 0]
      , m [7, 6, 5, 4, 4, 5, 6, 7]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

--------------------------------------------------------------------------------
-- Semigroup
--------------------------------------------------------------------------------

exampleSpec_Semigroup_mappend_String :: Spec
exampleSpec_Semigroup_mappend_String = unitTestSpec
    "Semigroup.mappend (String)"
    "mappend"
    (mappend)
    (exampleData_Semigroup_concat_String)

exampleData_Semigroup_concat_String :: UnitTestData2
    (MonoidMap LatinChar String)
    (MonoidMap LatinChar String)
    (MonoidMap LatinChar String)
exampleData_Semigroup_concat_String = unitTestData2
    [ ( m ["abc", "ij" , "p"  , ""   ]
      , m [   "",   "k",  "qr", "xyz"]
      , m ["abc", "ijk", "pqr", "xyz"]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_Semigroup_mappend_Sum_Natural :: Spec
exampleSpec_Semigroup_mappend_Sum_Natural = unitTestSpec
    "Semigroup.mappend (Sum Natural)"
    "mappend"
    (mappend)
    (exampleData_Semigroup_concat_Sum_Natural)

exampleData_Semigroup_concat_Sum_Natural :: UnitTestData2
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
exampleData_Semigroup_concat_Sum_Natural = unitTestData2
    [ ( m [4, 2, 1, 0]
      , m [0, 1, 2, 4]
      , m [4, 3, 3, 4]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

--------------------------------------------------------------------------------
-- Group
--------------------------------------------------------------------------------

exampleSpec_Group_invert_Product_Rational :: Spec
exampleSpec_Group_invert_Product_Rational = unitTestSpec
    "Group.invert (Product Rational)"
    "invert"
    (invert)
    (exampleData_Group_invert_Product_Rational)

exampleData_Group_invert_Product_Rational :: UnitTestData1
    (MonoidMap LatinChar (Product Rational))
    (MonoidMap LatinChar (Product Rational))
exampleData_Group_invert_Product_Rational = unitTestData1
    [ ( m [  2,   4,   8,   16]
      , m [1%2, 1%4, 1%8, 1%16]
      )
    , ( m [1%2, 1%4, 1%8, 1%16]
      , m [  2,   4,   8,   16]
      )
    , ( m [  2, 1%4,   8,   16]
      , m [1%2,   4, 1%8, 1%16]
      )
    , ( m [1%2,   4, 1%8, 1%16]
      , m [  2, 1%4,   8,   16]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..] . fmap Product

exampleSpec_Group_invert_Sum_Integer :: Spec
exampleSpec_Group_invert_Sum_Integer = unitTestSpec
    "Group.invert (Sum Integer)"
    "invert"
    (invert)
    (exampleData_Group_invert_Sum_Integer)

exampleData_Group_invert_Sum_Integer :: UnitTestData1
    (MonoidMap LatinChar (Sum Integer))
    (MonoidMap LatinChar (Sum Integer))
exampleData_Group_invert_Sum_Integer = unitTestData1
    [ ( m [ 1,  2,  3,  4]
      , m [-1, -2, -3, -4]
      )
    , ( m [-1, -2, -3, -4]
      , m [ 1,  2,  3,  4]
      )
    , ( m [ 1, -2,  3, -4]
      , m [-1,  2, -3,  4]
      )
    , ( m [-1,  2, -3,  4]
      , m [ 1, -2,  3, -4]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..] . fmap Sum

exampleSpec_Group_pow_Product_Rational :: Spec
exampleSpec_Group_pow_Product_Rational = unitTestSpec
    "Group.pow (Product Rational)"
    "pow"
    (pow)
    (exampleData_Group_pow_Product_Rational)

exampleData_Group_pow_Product_Rational :: UnitTestData2
    (MonoidMap LatinChar (Product Rational))
    (Integer)
    (MonoidMap LatinChar (Product Rational))
exampleData_Group_pow_Product_Rational = unitTestData2
    [ ( m [  2,   -4,   8,   -16], (-1)
      , m [1%2, -1%4, 1%8, -1%16]
      )
    , ( m [  2,   -4,   8,   -16], 0
      , m [  1,    1,   1,     1]
      )
    , ( m [  2,   -4,   8,   -16], 1
      , m [  2,   -4,   8,   -16]
      )
    , ( m [  2,   -4,   8,   -16], 2
      , m [  4,   16,  64,   256]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..] . fmap Product

exampleSpec_Group_pow_Sum_Integer :: Spec
exampleSpec_Group_pow_Sum_Integer = unitTestSpec
    "Group.pow (Sum Integer)"
    "pow"
    (pow)
    (exampleData_Group_pow_Sum_Integer)

exampleData_Group_pow_Sum_Integer :: UnitTestData2
    (MonoidMap LatinChar (Sum Integer))
    (Integer)
    (MonoidMap LatinChar (Sum Integer))
exampleData_Group_pow_Sum_Integer = unitTestData2
    [ ( m [ 1, -2,  3, -4], (-1)
      , m [-1,  2, -3,  4]
      )
    , ( m [ 1, -2,  3, -4], 0
      , m [ 0,  0,  0,  0]
      )
    , ( m [ 1, -2,  3, -4], 1
      , m [ 1, -2,  3, -4]
      )
    , ( m [ 1, -2,  3, -4], 2
      , m [ 2, -4,  6, -8]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..] . fmap Sum

exampleSpec_Group_subtract_Product_Rational :: Spec
exampleSpec_Group_subtract_Product_Rational = unitTestSpec
    "Group.(~~) (Product Rational)"
    "(~~)"
    (~~)
    (exampleData_Group_subtract_Product_Rational)

exampleData_Group_subtract_Product_Rational :: UnitTestData2
    (MonoidMap LatinChar (Product Rational))
    (MonoidMap LatinChar (Product Rational))
    (MonoidMap LatinChar (Product Rational))
exampleData_Group_subtract_Product_Rational = unitTestData2
    [ ( m [ 1,    1,    1,    1]
      , m [ 1,    2,    4,    8]
      , m [ 1,  1%2,  1%4,  1%8]
      )
    , ( m [-1,   -1,   -1,   -1]
      , m [ 1,    2,    4,    8]
      , m [-1, -1%2, -1%4, -1%8]
      )
    , ( m [ 1,    1,    1,    1]
      , m [-1,   -2,   -4,   -8]
      , m [-1, -1%2, -1%4, -1%8]
      )
    , ( m [-1,   -1,   -1,   -1]
      , m [-1,   -2,   -4,   -8]
      , m [ 1,  1%2,  1%4,  1%8]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..] . fmap Product

exampleSpec_Group_subtract_Sum_Integer :: Spec
exampleSpec_Group_subtract_Sum_Integer = unitTestSpec
    "Group.(~~) (Sum Integer)"
    "(~~)"
    (~~)
    (exampleData_Group_subtract_Sum_Integer)

exampleData_Group_subtract_Sum_Integer :: UnitTestData2
    (MonoidMap LatinChar (Sum Integer))
    (MonoidMap LatinChar (Sum Integer))
    (MonoidMap LatinChar (Sum Integer))
exampleData_Group_subtract_Sum_Integer = unitTestData2
    [ ( m [ 1,  2,  3,  4]
      , m [ 1,  2,  3,  4]
      , m [ 0,  0,  0,  0]
      )
    , ( m [ 0,  0,  0,  0]
      , m [ 1,  2,  3,  4]
      , m [-1, -2, -3, -4]
      )
    , ( m [ 1,  2,  3,  4]
      , m [-1, -2, -3, -4]
      , m [ 2,  4,  6,  8]
      )
    , ( m [-1, -2, -3, -4]
      , m [-1, -2, -3, -4]
      , m [ 0,  0,  0,  0]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..] . fmap Sum

--------------------------------------------------------------------------------
-- Reductive
--------------------------------------------------------------------------------

exampleSpec_Reductive_isPrefixOf_String :: Spec
exampleSpec_Reductive_isPrefixOf_String = unitTestSpec
    "Reductive.isPrefixOf (String)"
    "isPrefixOf"
    (isPrefixOf)
    (exampleData_Reductive_isPrefixOf_String)

exampleData_Reductive_isPrefixOf_String :: UnitTestData2
    (MonoidMap LatinChar String)
    (MonoidMap LatinChar String)
    (Bool)
exampleData_Reductive_isPrefixOf_String = unitTestData2
    [ ( m ["A"   , "B"   , "C"   ]
      , m ["A123", "B123", "C123"]
      , True
      )
    , ( m ["A123", "B123", "C123"]
      , m ["A"   , "B"   , "C"   ]
      , False
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_Reductive_isSuffixOf_String :: Spec
exampleSpec_Reductive_isSuffixOf_String = unitTestSpec
    "Reductive.isSuffixOf (String)"
    "isSuffixOf"
    (isSuffixOf)
    (exampleData_Reductive_isSuffixOf_String)

exampleData_Reductive_isSuffixOf_String :: UnitTestData2
    (MonoidMap LatinChar String)
    (MonoidMap LatinChar String)
    (Bool)
exampleData_Reductive_isSuffixOf_String = unitTestData2
    [ ( m [   "A",    "B",    "C"]
      , m ["123A", "123B", "123C"]
      , True
      )
    , ( m ["123A", "123B", "123C"]
      , m [   "A",    "B",    "C"]
      , False
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_Reductive_isPrefixOf_Sum_Natural :: Spec
exampleSpec_Reductive_isPrefixOf_Sum_Natural = unitTestSpec
    "Reductive.isPrefixOf (Sum Natural)"
    "isPrefixOf"
    (isPrefixOf)
    (exampleData_Reductive_Sum_Natural)

exampleSpec_Reductive_isSuffixOf_Sum_Natural :: Spec
exampleSpec_Reductive_isSuffixOf_Sum_Natural = unitTestSpec
    "Reductive.isSuffixOf (Sum Natural)"
    "isSuffixOf"
    (isSuffixOf)
    (exampleData_Reductive_Sum_Natural)

exampleData_Reductive_Sum_Natural :: UnitTestData2
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
    (Bool)
exampleData_Reductive_Sum_Natural = unitTestData2
    [ ( m [1, 1], m [1, 1], True )
    , ( m [1, 1], m [1, 2], True )
    , ( m [1, 1], m [2, 1], True )
    , ( m [1, 1], m [2, 2], True )
    , ( m [1, 2], m [1, 1], False)
    , ( m [1, 2], m [1, 2], True )
    , ( m [1, 2], m [2, 1], False)
    , ( m [1, 2], m [2, 2], True )
    , ( m [2, 1], m [1, 1], False)
    , ( m [2, 1], m [1, 2], False)
    , ( m [2, 1], m [2, 1], True )
    , ( m [2, 1], m [2, 2], True )
    , ( m [2, 2], m [1, 1], False)
    , ( m [2, 2], m [1, 2], False)
    , ( m [2, 2], m [2, 1], False)
    , ( m [2, 2], m [2, 2], True )
    ]
  where
    m = MonoidMap.fromList . zip [A ..] . fmap Sum

exampleSpec_Reductive_stripPrefix_String :: Spec
exampleSpec_Reductive_stripPrefix_String = unitTestSpec
    "Reductive.stripPrefix (String)"
    "stripPrefix"
    (stripPrefix)
    (exampleData_Reductive_stripPrefix_String)

exampleData_Reductive_stripPrefix_String :: UnitTestData2
    (MonoidMap LatinChar String)
    (MonoidMap LatinChar String)
    (Maybe (MonoidMap LatinChar String))
exampleData_Reductive_stripPrefix_String = unitTestData2
    [ ( m [""   , ""   , ""   ]
      , m ["abc", "pqr", "xyz"]
      , m ["abc", "pqr", "xyz"] & Just
      )
    , ( m ["a"  , "p"  , "x"  ]
      , m ["abc", "pqr", "xyz"]
      , m [ "bc",  "qr",  "yz"] & Just
      )
    , ( m ["abc", "pqr", "xyz"]
      , m ["abc", "pqr", "xyz"]
      , m [   "",    "",    ""] & Just
      )
    , ( m ["?"  , "p"  , "x"  ]
      , m ["abc", "pqr", "xyz"]
      , Nothing
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_Reductive_stripPrefix_Sum_Natural :: Spec
exampleSpec_Reductive_stripPrefix_Sum_Natural = unitTestSpec
    "Reductive.stripPrefix (Sum Natural)"
    "stripPrefix"
    (stripPrefix)
    (exampleData_Reductive_stripPrefix_Sum_Natural)

exampleData_Reductive_stripPrefix_Sum_Natural :: UnitTestData2
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
    (Maybe (MonoidMap LatinChar (Sum Natural)))
exampleData_Reductive_stripPrefix_Sum_Natural = unitTestData2
    [ ( m [0, 0, 0]
      , m [2, 4, 8]
      , m [2, 4, 8] & Just
      )
    , ( m [1, 2, 4]
      , m [2, 4, 8]
      , m [1, 2, 4] & Just
      )
    , ( m [2, 4, 8]
      , m [2, 4, 8]
      , m [0, 0, 0] & Just
      )
    , ( m [3, 4, 8]
      , m [2, 4, 8]
      , Nothing
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_Reductive_stripSuffix_String :: Spec
exampleSpec_Reductive_stripSuffix_String = unitTestSpec
    "Reductive.stripSuffix (String)"
    "stripSuffix"
    (stripSuffix)
    (exampleData_Reductive_stripSuffix_String)

exampleData_Reductive_stripSuffix_String :: UnitTestData2
    (MonoidMap LatinChar String)
    (MonoidMap LatinChar String)
    (Maybe (MonoidMap LatinChar String))
exampleData_Reductive_stripSuffix_String = unitTestData2
    [ ( m [   "",    "",    ""]
      , m ["abc", "pqr", "xyz"]
      , m ["abc", "pqr", "xyz"] & Just
      )
    , ( m [  "c",   "r",   "z"]
      , m ["abc", "pqr", "xyz"]
      , m ["ab" , "pq" , "xy" ] & Just
      )
    , ( m ["abc", "pqr", "xyz"]
      , m ["abc", "pqr", "xyz"]
      , m [""   , ""   , ""   ] & Just
      )
    , ( m [  "?",   "r",   "z"]
      , m ["abc", "pqr", "xyz"]
      , Nothing
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_Reductive_stripSuffix_Sum_Natural :: Spec
exampleSpec_Reductive_stripSuffix_Sum_Natural = unitTestSpec
    "Reductive.stripSuffix (Sum Natural)"
    "stripSuffix"
    (stripSuffix)
    (exampleData_Reductive_stripSuffix_Sum_Natural)

exampleData_Reductive_stripSuffix_Sum_Natural :: UnitTestData2
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
    (Maybe (MonoidMap LatinChar (Sum Natural)))
exampleData_Reductive_stripSuffix_Sum_Natural = unitTestData2
    [ ( m [0, 0, 0]
      , m [2, 4, 8]
      , m [2, 4, 8] & Just
      )
    , ( m [1, 2, 4]
      , m [2, 4, 8]
      , m [1, 2, 4] & Just
      )
    , ( m [2, 4, 8]
      , m [2, 4, 8]
      , m [0, 0, 0] & Just
      )
    , ( m [3, 4, 8]
      , m [2, 4, 8]
      , Nothing
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

--------------------------------------------------------------------------------
-- LeftGCDMonoid
--------------------------------------------------------------------------------

exampleSpec_LeftGCDMonoid_commonPrefix_String :: Spec
exampleSpec_LeftGCDMonoid_commonPrefix_String = unitTestSpec
    "LeftGCDMonoid.commonPrefix (String)"
    "commonPrefix"
    (commonPrefix)
    (exampleData_LeftGCDMonoid_commonPrefix_String)

exampleData_LeftGCDMonoid_commonPrefix_String :: UnitTestData2
    (MonoidMap LatinChar String)
    (MonoidMap LatinChar String)
    (MonoidMap LatinChar String)
exampleData_LeftGCDMonoid_commonPrefix_String = unitTestData2
    [ ( m ["---", "---", "---"]
      , m ["abc", "pqr", "xyz"]
      , m [""   , ""   , ""   ]
      )
    , ( m ["a--", "p--", "x--"]
      , m ["abc", "pqr", "xyz"]
      , m ["a"  , "p"  , "x"  ]
      )
    , ( m ["ab-", "pq-", "xy-"]
      , m ["abc", "pqr", "xyz"]
      , m ["ab" , "pq" , "xy" ]
      )
    , ( m ["abc", "pqr", "xyz"]
      , m ["abc", "pqr", "xyz"]
      , m ["abc", "pqr", "xyz"]
      )
    , ( m ["abc", "pqr", "xyz"]
      , m ["ab-", "pq-", "xy-"]
      , m ["ab" , "pq" , "xy" ]
      )
    , ( m ["abc", "pqr", "xyz"]
      , m ["a--", "p--", "x--"]
      , m ["a"  , "p"  , "x"  ]
      )
    , ( m ["abc", "pqr", "xyz"]
      , m ["---", "---", "---"]
      , m [""   , ""   , ""   ]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_LeftGCDMonoid_commonPrefix_Sum_Natural :: Spec
exampleSpec_LeftGCDMonoid_commonPrefix_Sum_Natural = unitTestSpec
    "LeftGCDMonoid.commonPrefix (Sum Natural)"
    "commonPrefix"
    (commonPrefix)
    (exampleData_LeftGCDMonoid_commonPrefix_Sum_Natural)

exampleData_LeftGCDMonoid_commonPrefix_Sum_Natural :: UnitTestData2
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
exampleData_LeftGCDMonoid_commonPrefix_Sum_Natural = unitTestData2
    [ ( m [0, 0, 0]
      , m [1, 2, 3]
      , m [0, 0, 0]
      )
    , ( m [1, 1, 1]
      , m [1, 2, 3]
      , m [1, 1, 1]
      )
    , ( m [2, 2, 2]
      , m [1, 2, 3]
      , m [1, 2, 2]
      )
    , ( m [3, 3, 3]
      , m [1, 2, 3]
      , m [1, 2, 3]
      )
    , ( m [4, 4, 4]
      , m [1, 2, 3]
      , m [1, 2, 3]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_LeftGCDMonoid_stripCommonPrefix_String :: Spec
exampleSpec_LeftGCDMonoid_stripCommonPrefix_String = unitTestSpec
    "LeftGCDMonoid.stripCommonPrefix (String)"
    "stripCommonPrefix"
    (stripCommonPrefix)
    (exampleData_LeftGCDMonoid_stripCommonPrefix_String)

exampleData_LeftGCDMonoid_stripCommonPrefix_String :: UnitTestData2
    (MonoidMap LatinChar String)
    (MonoidMap LatinChar String)
    ( MonoidMap LatinChar String
    , MonoidMap LatinChar String
    , MonoidMap LatinChar String
    )
exampleData_LeftGCDMonoid_stripCommonPrefix_String = unitTestData2
    [ (   m ["---", "---", "---"]
      ,   m ["abc", "pqr", "xyz"]

      , ( m [""   , ""   , ""   ]
        , m ["---", "---", "---"]
        , m ["abc", "pqr", "xyz"]
        )
      )
    , (   m ["a--", "p--", "x--"]
      ,   m ["abc", "pqr", "xyz"]

      , ( m ["a"  , "p"  , "x"  ]
        , m [ "--",  "--",  "--"]
        , m [ "bc",  "qr",  "yz"]
        )
      )
    , (   m ["ab-", "pq-", "xy-"]
      ,   m ["abc", "pqr", "xyz"]

      , ( m ["ab" , "pq" , "xy" ]
        , m [  "-",   "-",   "-"]
        , m [  "c",   "r",   "z"]
        )
      )
    , (   m ["abc", "pqr", "xyz"]
      ,   m ["abc", "pqr", "xyz"]

      , ( m ["abc", "pqr", "xyz"]
        , m [   "",    "",    ""]
        , m [   "",    "",    ""]
        )
      )
    , (   m ["abc", "pqr", "xyz"]
      ,   m ["ab-", "pq-", "xy-"]

      , ( m ["ab" , "pq" , "xy" ]
        , m [  "c",   "r",   "z"]
        , m [  "-",   "-",   "-"]
        )
      )
    , (   m ["abc", "pqr", "xyz"]
      ,   m ["a--", "p--", "x--"]
      , ( m ["a"  , "p"  , "x"  ]
        , m [ "bc",  "qr",  "yz"]
        , m [ "--",  "--",  "--"]
        )
      )
    , (   m ["abc", "pqr", "xyz"]
      ,   m ["---", "---", "---"]
      , ( m [""   , ""   , ""   ]
        , m ["abc", "pqr", "xyz"]
        , m ["---", "---", "---"]
        )
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_LeftGCDMonoid_stripCommonPrefix_Sum_Natural :: Spec
exampleSpec_LeftGCDMonoid_stripCommonPrefix_Sum_Natural = unitTestSpec
    "LeftGCDMonoid.stripCommonPrefix (Sum Natural)"
    "stripCommonPrefix"
    (stripCommonPrefix)
    (exampleData_LeftGCDMonoid_stripCommonPrefix_Sum_Natural)

exampleData_LeftGCDMonoid_stripCommonPrefix_Sum_Natural :: UnitTestData2
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
    ( MonoidMap LatinChar (Sum Natural)
    , MonoidMap LatinChar (Sum Natural)
    , MonoidMap LatinChar (Sum Natural)
    )
exampleData_LeftGCDMonoid_stripCommonPrefix_Sum_Natural = unitTestData2
    [ (   m [0, 1, 2, 3, 4]
      ,   m [4, 3, 2, 1, 0]

      , ( m [0, 1, 2, 1, 0]
        , m [0, 0, 0, 2, 4]
        , m [4, 2, 0, 0, 0]
        )
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

--------------------------------------------------------------------------------
-- RightGCDMonoid
--------------------------------------------------------------------------------

exampleSpec_RightGCDMonoid_commonSuffix_String :: Spec
exampleSpec_RightGCDMonoid_commonSuffix_String = unitTestSpec
    "RightGCDMonoid.commonSuffix (String)"
    "commonSuffix"
    (commonSuffix)
    (exampleData_RightGCDMonoid_commonSuffix_String)

exampleData_RightGCDMonoid_commonSuffix_String :: UnitTestData2
    (MonoidMap LatinChar String)
    (MonoidMap LatinChar String)
    (MonoidMap LatinChar String)
exampleData_RightGCDMonoid_commonSuffix_String = unitTestData2
    [ ( m ["---", "---", "---"]
      , m ["abc", "pqr", "xyz"]
      , m [  "" ,    "",    ""]
      )
    , ( m ["--c", "--r", "--z"]
      , m ["abc", "pqr", "xyz"]
      , m [  "c",   "r",   "z"]
      )
    , ( m ["-bc", "-qr", "-yz"]
      , m ["abc", "pqr", "xyz"]
      , m [ "bc",  "qr",  "yz"]
      )
    , ( m ["abc", "pqr", "xyz"]
      , m ["abc", "pqr", "xyz"]
      , m ["abc", "pqr", "xyz"]
      )
    , ( m ["abc", "pqr", "xyz"]
      , m ["-bc", "-qr", "-yz"]
      , m [ "bc",  "qr",  "yz"]
      )
    , ( m ["abc", "pqr", "xyz"]
      , m ["--c", "--r", "--z"]
      , m [  "c",   "r",   "z"]
      )
    , ( m ["abc", "pqr", "xyz"]
      , m ["---", "---", "---"]
      , m [   "",    "",    ""]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_RightGCDMonoid_commonSuffix_Sum_Natural :: Spec
exampleSpec_RightGCDMonoid_commonSuffix_Sum_Natural = unitTestSpec
    "RightGCDMonoid.commonSuffix (Sum Natural)"
    "commonSuffix"
    (commonSuffix)
    (exampleData_RightGCDMonoid_commonSuffix_Sum_Natural)

exampleData_RightGCDMonoid_commonSuffix_Sum_Natural :: UnitTestData2
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
exampleData_RightGCDMonoid_commonSuffix_Sum_Natural = unitTestData2
    [ ( m [0, 0, 0]
      , m [1, 2, 3]
      , m [0, 0, 0]
      )
    , ( m [1, 1, 1]
      , m [1, 2, 3]
      , m [1, 1, 1]
      )
    , ( m [2, 2, 2]
      , m [1, 2, 3]
      , m [1, 2, 2]
      )
    , ( m [3, 3, 3]
      , m [1, 2, 3]
      , m [1, 2, 3]
      )
    , ( m [4, 4, 4]
      , m [1, 2, 3]
      , m [1, 2, 3]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_RightGCDMonoid_stripCommonSuffix_String :: Spec
exampleSpec_RightGCDMonoid_stripCommonSuffix_String = unitTestSpec
    "RightGCDMonoid.stripCommonSuffix (String)"
    "stripCommonSuffix"
    (stripCommonSuffix)
    (exampleData_RightGCDMonoid_stripCommonSuffix_String)

exampleData_RightGCDMonoid_stripCommonSuffix_String :: UnitTestData2
    (MonoidMap LatinChar String)
    (MonoidMap LatinChar String)
    ( MonoidMap LatinChar String
    , MonoidMap LatinChar String
    , MonoidMap LatinChar String
    )
exampleData_RightGCDMonoid_stripCommonSuffix_String = unitTestData2
    [ (   m ["---", "---", "---"]
      ,   m ["abc", "pqr", "xyz"]

      , ( m ["---", "---", "---"]
        , m ["abc", "pqr", "xyz"]
        , m [   "",    "",    ""]
        )
      )
    , (   m ["--c", "--r", "--z"]
      ,   m ["abc", "pqr", "xyz"]

      , ( m ["--" , "--" , "--" ]
        , m ["ab" , "pq" , "xy" ]
        , m [  "c",   "r",   "z"]
        )
      )
    , (   m ["--c", "--r", "--z"]
      ,   m ["abc", "pqr", "xyz"]

      , ( m ["--" , "--" , "--" ]
        , m ["ab" , "pq" , "xy" ]
        , m [  "c",   "r",   "z"]
        )
      )
    , (   m ["-bc", "-qr", "-yz"]
      ,   m ["abc", "pqr", "xyz"]

      , ( m ["-"  , "-"  , "-"  ]
        , m ["a"  , "p"  , "x"  ]
        , m [ "bc",  "qr",  "yz"]
        )
      )
    , (   m ["abc", "pqr", "xyz"]
      ,   m ["abc", "pqr", "xyz"]

      , ( m [""   , ""   , ""   ]
        , m [""   , ""   , ""   ]
        , m ["abc", "pqr", "xyz"]
        )
      )
    , (   m ["abc", "pqr", "xyz"]
      ,   m ["-bc", "-qr", "-yz"]

      , ( m ["a"  , "p"  , "x"  ]
        , m ["-"  , "-"  , "-"  ]
        , m [ "bc",  "qr",  "yz"]
        )
      )
    , (   m ["abc", "pqr", "xyz"]
      ,   m ["--c", "--r", "--z"]

      , ( m ["ab" , "pq" , "xy" ]
        , m ["--" , "--" , "--" ]
        , m [  "c",   "r",   "z"]
        )
      )
    , (   m ["abc", "pqr", "xyz"]
      ,   m ["---", "---", "---"]

      , ( m ["abc", "pqr", "xyz"]
        , m ["---", "---", "---"]
        , m [   "",    "",    ""]
        )
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_RightGCDMonoid_stripCommonSuffix_Sum_Natural :: Spec
exampleSpec_RightGCDMonoid_stripCommonSuffix_Sum_Natural = unitTestSpec
    "RightGCDMonoid.stripCommonSuffix (Sum Natural)"
    "stripCommonSuffix"
    (stripCommonSuffix)
    (exampleData_RightGCDMonoid_stripCommonSuffix_Sum_Natural)

exampleData_RightGCDMonoid_stripCommonSuffix_Sum_Natural :: UnitTestData2
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
    ( MonoidMap LatinChar (Sum Natural)
    , MonoidMap LatinChar (Sum Natural)
    , MonoidMap LatinChar (Sum Natural)
    )
exampleData_RightGCDMonoid_stripCommonSuffix_Sum_Natural = unitTestData2
    [ (   m [0, 1, 2, 3, 4]
      ,   m [4, 3, 2, 1, 0]

      , ( m [0, 0, 0, 2, 4]
        , m [4, 2, 0, 0, 0]
        , m [0, 1, 2, 1, 0]
        )
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

--------------------------------------------------------------------------------
-- OverlappingGCDMonoid
--------------------------------------------------------------------------------

exampleSpec_OverlappingGCDMonoid_overlap_String :: Spec
exampleSpec_OverlappingGCDMonoid_overlap_String = unitTestSpec
    "OverlappingGCDMonoid.overlap (String)"
    "overlap"
    (overlap)
    (exampleData_OverlappingGCDMonoid_overlap_String)

exampleData_OverlappingGCDMonoid_overlap_String :: UnitTestData2
    (MonoidMap LatinChar String)
    (MonoidMap LatinChar String)
    (MonoidMap LatinChar String)
exampleData_OverlappingGCDMonoid_overlap_String = unitTestData2
    [ ( m ["abcd"    , "0123"    ]
      , m [    "efgh",     "4567"]
      , m [    ""    ,     ""    ]
      )
    , ( m ["abcde"   , "01234"   ]
      , m [   "defgh",    "34567"]
      , m [   "de"   ,    "34"   ]
      )
    , ( m ["abcdef"  , "012345"  ]
      , m [  "cdefgh",   "234567"]
      , m [  "cdef"  ,   "2345"  ]
      )
    , ( m ["abcdefg" , "0123456" ]
      , m [ "bcdefgh",  "1234567"]
      , m [ "bcdefg" ,  "123456" ]
      )
    , ( m ["abcdefgh", "01234567"]
      , m ["abcdefgh", "01234567"]
      , m ["abcdefgh", "01234567"]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_OverlappingGCDMonoid_overlap_Sum_Natural :: Spec
exampleSpec_OverlappingGCDMonoid_overlap_Sum_Natural = unitTestSpec
    "OverlappingGCDMonoid.overlap (Sum Natural)"
    "overlap"
    (overlap)
    (exampleData_OverlappingGCDMonoid_overlap_Sum_Natural)

exampleData_OverlappingGCDMonoid_overlap_Sum_Natural :: UnitTestData2
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
exampleData_OverlappingGCDMonoid_overlap_Sum_Natural = unitTestData2
    [ ( m [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      , m [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
      , m [0, 1, 2, 3, 4, 4, 3, 2, 1, 0]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_OverlappingGCDMonoid_stripPrefixOverlap_String :: Spec
exampleSpec_OverlappingGCDMonoid_stripPrefixOverlap_String = unitTestSpec
    "OverlappingGCDMonoid.stripPrefixOverlap (String)"
    "stripPrefixOverlap"
    (stripPrefixOverlap)
    (exampleData_OverlappingGCDMonoid_stripPrefixOverlap_String)

exampleData_OverlappingGCDMonoid_stripPrefixOverlap_String :: UnitTestData2
    (MonoidMap LatinChar String)
    (MonoidMap LatinChar String)
    (MonoidMap LatinChar String)
exampleData_OverlappingGCDMonoid_stripPrefixOverlap_String = unitTestData2
    [ ( m ["abcd"    , "0123"    ]
      , m [    "efgh",     "4567"]
      , m [    "efgh",     "4567"]
      )
    , ( m ["abcde"   , "01234"   ]
      , m [   "defgh",    "34567"]
      , m [     "fgh",      "567"]
      )
    , ( m ["abcdef"  , "012345"  ]
      , m [  "cdefgh",   "234567"]
      , m [      "gh",       "67"]
      )
    , ( m ["abcdefg" , "0123456" ]
      , m [ "bcdefgh",  "1234567"]
      , m [       "h",        "7"]
      )
    , ( m ["abcdefgh", "01234567"]
      , m ["abcdefgh", "01234567"]
      , m [        "",         ""]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_OverlappingGCDMonoid_stripSuffixOverlap_String :: Spec
exampleSpec_OverlappingGCDMonoid_stripSuffixOverlap_String = unitTestSpec
    "OverlappingGCDMonoid.stripSuffixOverlap (String)"
    "stripSuffixOverlap"
    (stripSuffixOverlap)
    (exampleData_OverlappingGCDMonoid_stripSuffixOverlap_String)

exampleData_OverlappingGCDMonoid_stripSuffixOverlap_String :: UnitTestData2
    (MonoidMap LatinChar String)
    (MonoidMap LatinChar String)
    (MonoidMap LatinChar String)
exampleData_OverlappingGCDMonoid_stripSuffixOverlap_String = unitTestData2
    [ ( m [    "efgh",     "4567"]
      , m ["abcd"    , "0123"    ]
      , m ["abcd"    , "0123"    ]
      )
    , ( m [   "defgh",    "34567"]
      , m ["abcde"   , "01234"   ]
      , m ["abc"     , "012"     ]
      )
    , ( m [  "cdefgh",   "234567"]
      , m ["abcdef"  , "012345"  ]
      , m ["ab"      , "01"      ]
      )
    , ( m [ "bcdefgh",  "1234567"]
      , m ["abcdefg" , "0123456" ]
      , m ["a"       , "0"       ]
      )
    , ( m ["abcdefgh", "01234567"]
      , m ["abcdefgh", "01234567"]
      , m [""        , ""        ]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_OverlappingGCDMonoid_stripPrefixOverlap_Sum_Natural :: Spec
exampleSpec_OverlappingGCDMonoid_stripPrefixOverlap_Sum_Natural = unitTestSpec
    "OverlappingGCDMonoid.stripPrefixOverlap (Sum Natural)"
    "stripPrefixOverlap"
    (stripPrefixOverlap)
    (exampleData_OverlappingGCDMonoid_stripPrefixOverlap_Sum_Natural)

exampleData_OverlappingGCDMonoid_stripPrefixOverlap_Sum_Natural
    :: UnitTestData2
        (MonoidMap LatinChar (Sum Natural))
        (MonoidMap LatinChar (Sum Natural))
        (MonoidMap LatinChar (Sum Natural))
exampleData_OverlappingGCDMonoid_stripPrefixOverlap_Sum_Natural = unitTestData2
    [ ( m [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      , m [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
      , m [9, 7, 5, 3, 1, 0, 0, 0, 0, 0]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_OverlappingGCDMonoid_stripSuffixOverlap_Sum_Natural :: Spec
exampleSpec_OverlappingGCDMonoid_stripSuffixOverlap_Sum_Natural = unitTestSpec
    "OverlappingGCDMonoid.stripSuffixOverlap (Sum Natural)"
    "stripSuffixOverlap"
    (stripSuffixOverlap)
    (exampleData_OverlappingGCDMonoid_stripSuffixOverlap_Sum_Natural)

exampleData_OverlappingGCDMonoid_stripSuffixOverlap_Sum_Natural
    :: UnitTestData2
        (MonoidMap LatinChar (Sum Natural))
        (MonoidMap LatinChar (Sum Natural))
        (MonoidMap LatinChar (Sum Natural))
exampleData_OverlappingGCDMonoid_stripSuffixOverlap_Sum_Natural = unitTestData2
    [ ( m [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      , m [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
      , m [9, 7, 5, 3, 1, 0, 0, 0, 0, 0]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

--------------------------------------------------------------------------------
-- GCDMonoid
--------------------------------------------------------------------------------

exampleSpec_GCDMonoid_gcd_Product_Natural :: Spec
exampleSpec_GCDMonoid_gcd_Product_Natural = unitTestSpec
    "GCDMonoid.gcd (Product Natural)"
    "gcd"
    (gcd)
    (exampleData_GCDMonoid_gcd_Product_Natural)

exampleData_GCDMonoid_gcd_Product_Natural :: UnitTestData2
    (MonoidMap LatinChar (Product Natural))
    (MonoidMap LatinChar (Product Natural))
    (MonoidMap LatinChar (Product Natural))
exampleData_GCDMonoid_gcd_Product_Natural = unitTestData2
    [ ( m [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      , m [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
      , m [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      )
    , ( m [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      , m [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
      , m [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
      )
    , ( m [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      , m [2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
      , m [2, 1, 2, 1, 2, 1, 2, 1, 2, 1]
      )
    , ( m [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      , m [3, 3, 3, 3, 3, 3, 3, 3, 3, 3]
      , m [3, 1, 1, 3, 1, 1, 3, 1, 1, 3]
      )
    , ( m [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      , m [4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
      , m [4, 1, 2, 1, 4, 1, 2, 1, 4, 1]
      )
    , ( m [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      , m [5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
      , m [5, 1, 1, 1, 1, 5, 1, 1, 1, 1]
      )
    , ( m [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      , m [6, 6, 6, 6, 6, 6, 6, 6, 6, 6]
      , m [6, 1, 2, 3, 2, 1, 6, 1, 2, 3]
      )
    , ( m [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      , m [7, 7, 7, 7, 7, 7, 7, 7, 7, 7]
      , m [7, 1, 1, 1, 1, 1, 1, 7, 1, 1]
      )
    , ( m [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      , m [8, 8, 8, 8, 8, 8, 8, 8, 8, 8]
      , m [8, 1, 2, 1, 4, 1, 2, 1, 8, 1]
      )
    , ( m [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      , m [9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
      , m [9, 1, 1, 3, 1, 1, 3, 1, 1, 9]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_GCDMonoid_gcd_Sum_Natural :: Spec
exampleSpec_GCDMonoid_gcd_Sum_Natural = unitTestSpec
    "GCDMonoid.gcd (Sum Natural)"
    "gcd"
    (gcd)
    (exampleData_GCDMonoid_gcd_Sum_Natural)

exampleData_GCDMonoid_gcd_Sum_Natural :: UnitTestData2
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
exampleData_GCDMonoid_gcd_Sum_Natural = unitTestData2
    [ ( m [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      , m [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
      , m [0, 1, 2, 3, 4, 4, 3, 2, 1, 0]
      )
    , ( m [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
      , m [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      , m [0, 1, 2, 3, 4, 4, 3, 2, 1, 0]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_GCDMonoid_gcd_Set_Natural :: Spec
exampleSpec_GCDMonoid_gcd_Set_Natural = unitTestSpec
    "GCDMonoid.gcd (Set Natural)"
    "gcd"
    (gcd)
    (exampleData_GCDMonoid_gcd_Set_Natural)

exampleData_GCDMonoid_gcd_Set_Natural :: UnitTestData2
    (MonoidMap LatinChar (Set Natural))
    (MonoidMap LatinChar (Set Natural))
    (MonoidMap LatinChar (Set Natural))
exampleData_GCDMonoid_gcd_Set_Natural = unitTestData2
    [ ( m [[0, 1, 2, 3], [4, 5, 6, 7]]
      , m [[0, 1, 2, 3], [4, 5, 6, 7]]
      , m [[0, 1, 2, 3], [4, 5, 6, 7]]
      )
    , ( m [[0, 1, 2, 3], [4, 5, 6, 7]]
      , m [[          ], [          ]]
      , m [[          ], [          ]]
      )
    , ( m [[          ], [          ]]
      , m [[0, 1, 2, 3], [4, 5, 6, 7]]
      , m [[          ], [          ]]
      )
    , ( m [[0, 1, 2, 3], [4, 5, 6, 7]]
      , m [[   1, 2, 3], [   5, 6, 7]]
      , m [[   1, 2, 3], [   5, 6, 7]]
      )
    , ( m [[   1, 2, 3], [   5, 6, 7]]
      , m [[0, 1, 2, 3], [4, 5, 6, 7]]
      , m [[   1, 2, 3], [   5, 6, 7]]
      )
    , ( m [[0, 1, 2   ], [4, 5, 6   ]]
      , m [[   1, 2, 3], [   5, 6, 7]]
      , m [[   1, 2   ], [   5, 6   ]]
      )
    , ( m [[   1, 2, 3], [   5, 6, 7]]
      , m [[0, 1, 2   ], [4, 5, 6   ]]
      , m [[   1, 2   ], [   5, 6   ]]
      )
    , ( m [[0, 1      ], [4, 5      ]]
      , m [[      2, 3], [      6, 7]]
      , m [[          ], [          ]]
      )
    , ( m [[      2, 3], [      6, 7]]
      , m [[0, 1      ], [4, 5      ]]
      , m [[          ], [          ]]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..] . fmap Set.fromList

--------------------------------------------------------------------------------
-- LCMMonoid
--------------------------------------------------------------------------------

exampleSpec_LCMMonoid_lcm_Product_Natural :: Spec
exampleSpec_LCMMonoid_lcm_Product_Natural = unitTestSpec
    "LCMMonoid.lcm (Product Natural)"
    "lcm"
    (lcm)
    (exampleData_LCMMonoid_lcm_Product_Natural)

exampleData_LCMMonoid_lcm_Product_Natural :: UnitTestData2
    (MonoidMap LatinChar (Product Natural))
    (MonoidMap LatinChar (Product Natural))
    (MonoidMap LatinChar (Product Natural))
exampleData_LCMMonoid_lcm_Product_Natural = unitTestData2
    [ ( m [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9]
      , m [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0]
      , m [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0]
      )
    , ( m [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9]
      , m [ 1,  1,  1,  1,  1,  1,  1,  1,  1,  1]
      , m [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9]
      )
    , ( m [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9]
      , m [ 2,  2,  2,  2,  2,  2,  2,  2,  2,  2]
      , m [ 0,  2,  2,  6,  4, 10,  6, 14,  8, 18]
      )
    , ( m [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9]
      , m [ 3,  3,  3,  3,  3,  3,  3,  3,  3,  3]
      , m [ 0,  3,  6,  3, 12, 15,  6, 21, 24,  9]
      )
    , ( m [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9]
      , m [ 4,  4,  4,  4,  4,  4,  4,  4,  4,  4]
      , m [ 0,  4,  4, 12,  4, 20, 12, 28,  8, 36]
      )
    , ( m [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9]
      , m [ 5,  5,  5,  5,  5,  5,  5,  5,  5,  5]
      , m [ 0,  5, 10, 15, 20,  5, 30, 35, 40, 45]
      )
    , ( m [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9]
      , m [ 6,  6,  6,  6,  6,  6,  6,  6,  6,  6]
      , m [ 0,  6,  6,  6, 12, 30,  6, 42, 24, 18]
      )
    , ( m [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9]
      , m [ 7,  7,  7,  7,  7,  7,  7,  7,  7,  7]
      , m [ 0,  7, 14, 21, 28, 35, 42,  7, 56, 63]
      )
    , ( m [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9]
      , m [ 8,  8,  8,  8,  8,  8,  8,  8,  8,  8]
      , m [ 0,  8,  8, 24,  8, 40, 24, 56,  8, 72]
      )
    , ( m [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9]
      , m [ 9,  9,  9,  9,  9,  9,  9,  9,  9,  9]
      , m [ 0,  9, 18,  9, 36, 45, 18, 63, 72,  9]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_LCMMonoid_lcm_Sum_Natural :: Spec
exampleSpec_LCMMonoid_lcm_Sum_Natural = unitTestSpec
    "LCMMonoid.lcm (Sum Natural)"
    "lcm"
    (lcm)
    (exampleData_LCMMonoid_lcm_Sum_Natural)

exampleData_LCMMonoid_lcm_Sum_Natural :: UnitTestData2
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
exampleData_LCMMonoid_lcm_Sum_Natural = unitTestData2
    [ ( m [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      , m [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
      , m [9, 8, 7, 6, 5, 5, 6, 7, 8, 9]
      )
    , ( m [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
      , m [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      , m [9, 8, 7, 6, 5, 5, 6, 7, 8, 9]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

exampleSpec_LCMMonoid_lcm_Set_Natural :: Spec
exampleSpec_LCMMonoid_lcm_Set_Natural = unitTestSpec
    "LCMMonoid.lcm (Set Natural)"
    "lcm"
    (lcm)
    (exampleData_LCMMonoid_lcm_Set_Natural)

exampleData_LCMMonoid_lcm_Set_Natural :: UnitTestData2
    (MonoidMap LatinChar (Set Natural))
    (MonoidMap LatinChar (Set Natural))
    (MonoidMap LatinChar (Set Natural))
exampleData_LCMMonoid_lcm_Set_Natural = unitTestData2
    [ ( m [[0, 1, 2, 3], [4, 5, 6, 7]]
      , m [[0, 1, 2, 3], [4, 5, 6, 7]]
      , m [[0, 1, 2, 3], [4, 5, 6, 7]]
      )
    , ( m [[0, 1, 2, 3], [4, 5, 6, 7]]
      , m [[          ], [          ]]
      , m [[0, 1, 2, 3], [4, 5, 6, 7]]
      )
    , ( m [[          ], [          ]]
      , m [[0, 1, 2, 3], [4, 5, 6, 7]]
      , m [[0, 1, 2, 3], [4, 5, 6, 7]]
      )
    , ( m [[0, 1, 2, 3], [4, 5, 6, 7]]
      , m [[   1, 2, 3], [   5, 6, 7]]
      , m [[0, 1, 2, 3], [4, 5, 6, 7]]
      )
    , ( m [[   1, 2, 3], [   5, 6, 7]]
      , m [[0, 1, 2, 3], [4, 5, 6, 7]]
      , m [[0, 1, 2, 3], [4, 5, 6, 7]]
      )
    , ( m [[0, 1, 2   ], [4, 5, 6   ]]
      , m [[   1, 2, 3], [   5, 6, 7]]
      , m [[0, 1, 2, 3], [4, 5, 6, 7]]
      )
    , ( m [[   1, 2, 3], [   5, 6, 7]]
      , m [[0, 1, 2   ], [4, 5, 6   ]]
      , m [[0, 1, 2, 3], [4, 5, 6, 7]]
      )
    , ( m [[0, 1      ], [4, 5      ]]
      , m [[      2, 3], [      6, 7]]
      , m [[0, 1, 2, 3], [4, 5, 6, 7]]
      )
    , ( m [[      2, 3], [      6, 7]]
      , m [[0, 1      ], [4, 5      ]]
      , m [[0, 1, 2, 3], [4, 5, 6, 7]]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..] . fmap Set.fromList

--------------------------------------------------------------------------------
-- Monus
--------------------------------------------------------------------------------

exampleSpec_Monus_monus_Set_Natural :: Spec
exampleSpec_Monus_monus_Set_Natural = unitTestSpec
    "Monus.monus (Set Natural)"
    "<\\>"
    (<\>)
    (exampleData_Monus_monus_Set_Natural)

exampleData_Monus_monus_Set_Natural :: UnitTestData2
    (MonoidMap LatinChar (Set Natural))
    (MonoidMap LatinChar (Set Natural))
    (MonoidMap LatinChar (Set Natural))
exampleData_Monus_monus_Set_Natural = unitTestData2
    [ ( m [[0, 1, 2], [3, 4, 5]]
      , m [[       ], [       ]]
      , m [[0, 1, 2], [3, 4, 5]]
      )
    , ( m [[0, 1, 2], [3, 4, 5]]
      , m [[0      ], [3      ]]
      , m [[   1, 2], [   4, 5]]
      )
    , ( m [[0, 1, 2], [3, 4, 5]]
      , m [[   1   ], [   4   ]]
      , m [[0,    2], [3,    5]]
      )
    , ( m [[0, 1, 2], [3, 4, 5]]
      , m [[      2], [      5]]
      , m [[0, 1   ], [3, 4   ]]
      )
    , ( m [[0, 1, 2], [3, 4, 5]]
      , m [[0, 1, 2], [3, 4, 5]]
      , m [[       ], [       ]]
      )
    , ( m [[0, 1, 2], [3, 4, 5]]
      , m [[3, 4, 5], [0, 1, 2]]
      , m [[0, 1, 2], [3, 4, 5]]
      )
    , ( m [[0, 1, 2], [3, 4, 5]]
      , m [[2, 3, 4], [1, 2, 3]]
      , m [[0, 1   ], [   4, 5]]
      )
    , ( m [[0, 1, 2], [3, 4, 5]]
      , m [[1, 2, 3], [2, 3, 4]]
      , m [[0      ], [      5]]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..] . fmap Set.fromList

exampleSpec_Monus_monus_Sum_Natural :: Spec
exampleSpec_Monus_monus_Sum_Natural = unitTestSpec
    "Monus.monus (Sum Natural)"
    "<\\>"
    (<\>)
    (exampleData_Monus_monus_Sum_Natural)

exampleData_Monus_monus_Sum_Natural :: UnitTestData2
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
    (MonoidMap LatinChar (Sum Natural))
exampleData_Monus_monus_Sum_Natural = unitTestData2
    [ ( m [0, 1, 2, 3]
      , m [0, 0, 0, 0]
      , m [0, 1, 2, 3]
      )
    , ( m [0, 1, 2, 3]
      , m [1, 1, 1, 1]
      , m [0, 0, 1, 2]
      )
    , ( m [0, 1, 2, 3]
      , m [2, 2, 2, 2]
      , m [0, 0, 0, 1]
      )
    , ( m [0, 1, 2, 3]
      , m [3, 3, 3, 3]
      , m [0, 0, 0, 0]
      )
    , ( m [0, 1, 2, 3]
      , m [4, 4, 4, 4]
      , m [0, 0, 0, 0]
      )
    ]
  where
    m = MonoidMap.fromList . zip [A ..]

--------------------------------------------------------------------------------
-- Utilities
--------------------------------------------------------------------------------

data LatinChar
    = A | B | C | D | E | F | G | H | I | J | K | L | M
    | N | O | P | Q | R | S | T | U | V | W | X | Y | Z
    deriving (Bounded, Enum, Eq, Ord, Show)