testOrderingProperties :: forall collection
                        . ( IsList collection
                          , Element collection ~ Item collection
                          , Typeable collection
                          , Eq collection,   Eq (Element collection)
                          , Show collection, Show (Element collection)
                          , Ord collection,  Ord (Element collection)
                          )
                       => Proxy collection
                       -> Gen (Element collection)
                       -> Test
testOrderingProperties proxy genElement = Group "ordering"
    [ Property "x `compare` y" $ with2Elements $ \(l1, l2) ->
        (fromListP proxy l1 `compare` fromListP proxy l2) === (l1 `compare` l2)
    ]
  where
    with2Elements f = forAll ((,) <$> generateListOfElement genElement <*> generateListOfElement genElement) f
testOrderingProperties :: forall collection
                        . ( IsList collection
                          , Element collection ~ Item collection
                          , Typeable collection
                          , Eq collection,   Eq (Element collection)
                          , Show collection, Show (Element collection)
                          , Ord collection,  Ord (Element collection)
                          )
                       => Proxy collection
                       -> Gen (Element collection)
                       -> Test
testOrderingProperties proxy genElement = Group "ordering"
    [ Property "x `compare` y" $ with2Elements $ \(l1, l2) ->
        (fromListP proxy l1 `compare` fromListP proxy l2) === (l1 `compare` l2)
    ]
  where
    with2Elements f = forAll ((,) <$> generateListOfElement genElement <*> generateListOfElement genElement) f
testOrderingProperties proxy genElement = Group "ordering"
    [ Property "x `compare` y" $ with2Elements $ \(l1, l2) ->
        (fromListP proxy l1 `compare` fromListP proxy l2) === (l1 `compare` l2)
    ]
  where
    with2Elements f = forAll ((,) <$> generateListOfElement genElement <*> generateListOfElement genElement) f