{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeApplications #-} module Tests.Map (mapTests) where import Control.Applicative import Control.Comonad import Data.Coerce import Data.Foldable import Data.Functor.Identity import Data.List.NonEmpty (NonEmpty(..)) import Data.Semigroup.Foldable import Data.Semigroup.Traversable import Data.Text (Text) import Hedgehog import Test.Tasty import Tests.Util import qualified Data.List.NonEmpty as NE import qualified Data.Map as M import qualified Data.Map.NonEmpty as NEM import qualified Data.Map.NonEmpty.Internal as NEM import qualified Hedgehog.Gen as Gen import qualified Hedgehog.Range as Range mapTests :: TestTree mapTests = groupTree $$(discover) prop_valid :: Property prop_valid = property $ assert . NEM.valid =<< forAll neMapGen prop_valid_toMap :: Property prop_valid_toMap = property $ assert . M.valid . NEM.toMap =<< forAll neMapGen prop_valid_insertMinMap :: Property prop_valid_insertMinMap = property $ do n <- forAll $ do m <- mapGen let k = maybe dummyKey (subtract 1 . fst) $ M.lookupMin m v <- valGen pure $ NEM.insertMinMap k v m assert $ M.valid n prop_valid_insertMaxMap :: Property prop_valid_insertMaxMap = property $ do n <- forAll $ do m <- mapGen let k = maybe dummyKey ((+ 1) . fst) $ M.lookupMax m v <- valGen pure $ NEM.insertMaxMap k v m assert $ M.valid n prop_valid_insertMapMin :: Property prop_valid_insertMapMin = property $ do n <- forAll $ do m <- mapGen let k = maybe dummyKey (subtract 1 . fst) $ M.lookupMin m v <- valGen pure $ NEM.insertMapMin k v m assert $ NEM.valid n prop_valid_insertMapMax :: Property prop_valid_insertMapMax = property $ do n <- forAll $ do m <- mapGen let k = maybe dummyKey ((+ 1) . fst) $ M.lookupMax m v <- valGen pure $ NEM.insertMapMax k v m assert $ NEM.valid n prop_toMapIso1 :: Property prop_toMapIso1 = property $ do m0 <- forAll mapGen tripping m0 NEM.nonEmptyMap (Identity . maybe M.empty NEM.toMap) prop_toMapIso2 :: Property prop_toMapIso2 = property $ do m0 <- forAll $ Gen.maybe neMapGen tripping m0 (maybe M.empty NEM.toMap) (Identity . NEM.nonEmptyMap) prop_read_show :: Property prop_read_show = readShow neMapGen prop_read1_show1 :: Property prop_read1_show1 = readShow1 neMapGen prop_show_show1 :: Property prop_show_show1 = showShow1 neMapGen prop_show_show2 :: Property prop_show_show2 = showShow2 neMapGen prop_splitRoot :: Property prop_splitRoot = property $ do n <- forAll neMapGen let rs = NEM.splitRoot n allItems = foldMap1 NEM.keys rs n' = NEM.unions rs assert $ ascending allItems mapM_ (assert . (`NEM.isSubmapOf` n)) rs length allItems === length n' n === n' where ascending (x :| xs) = case NE.nonEmpty xs of Nothing -> True Just ys@(y :| _) -> x < y && ascending ys prop_extract_duplicate :: Property prop_extract_duplicate = property $ do n <- forAll neMapGen tripping n duplicate (Identity . extract) prop_fmap_extract_duplicate :: Property prop_fmap_extract_duplicate = property $ do n <- forAll neMapGen tripping n duplicate (Identity . fmap extract) prop_duplicate_duplicate :: Property prop_duplicate_duplicate = property $ do n <- forAll neMapGen let dd1 = duplicate . duplicate $ n dd2 = fmap duplicate . duplicate $ n assert $ NEM.valid dd1 assert $ NEM.valid dd2 dd1 === dd2 prop_insertMapWithKey :: Property prop_insertMapWithKey = ttProp (gf3 valGen :?> GTKey :-> GTVal :-> GTMap :-> TTNEMap) M.insertWithKey NEM.insertMapWithKey prop_singleton :: Property prop_singleton = ttProp (GTKey :-> GTVal :-> TTNEMap) M.singleton NEM.singleton prop_fromSet :: Property prop_fromSet = ttProp (gf1 valGen :?> GTNESet :-> TTNEMap) M.fromSet NEM.fromSet prop_fromAscList :: Property prop_fromAscList = ttProp (GTSorted STAsc (GTNEList Nothing (GTKey :&: GTVal)) :-> TTNEMap) M.fromAscList NEM.fromAscList prop_fromDescList :: Property prop_fromDescList = ttProp (GTSorted STDesc (GTNEList Nothing (GTKey :&: GTVal)) :-> TTNEMap) M.fromDescList NEM.fromDescList prop_fromAscListWithKey :: Property prop_fromAscListWithKey = ttProp (gf3 valGen :?> GTSorted STAsc (GTNEList Nothing (GTKey :&: GTVal)) :-> TTNEMap) M.fromAscListWithKey NEM.fromAscListWithKey prop_fromDescListWithKey :: Property prop_fromDescListWithKey = ttProp (gf3 valGen :?> GTSorted STDesc (GTNEList Nothing (GTKey :&: GTVal)) :-> TTNEMap) M.fromDescListWithKey NEM.fromDescListWithKey prop_fromDistinctAscList :: Property prop_fromDistinctAscList = ttProp (GTSorted STDistinctAsc (GTNEList Nothing (GTKey :&: GTVal)) :-> TTNEMap) M.fromDistinctAscList NEM.fromDistinctAscList prop_fromDistinctDescList :: Property prop_fromDistinctDescList = ttProp (GTSorted STDistinctDesc (GTNEList Nothing (GTKey :&: GTVal)) :-> TTNEMap) M.fromDistinctDescList NEM.fromDistinctDescList prop_fromListWithKey :: Property prop_fromListWithKey = ttProp (gf3 valGen :?> GTNEList Nothing (GTKey :&: GTVal) :-> TTNEMap) M.fromListWithKey NEM.fromListWithKey prop_insert :: Property prop_insert = ttProp (GTKey :-> GTVal :-> GTNEMap :-> TTNEMap) M.insert NEM.insert prop_insertWithKey :: Property prop_insertWithKey = ttProp (gf3 valGen :?> GTKey :-> GTVal :-> GTNEMap :-> TTNEMap) M.insertWithKey NEM.insertWithKey prop_delete :: Property prop_delete = ttProp (GTKey :-> GTNEMap :-> TTMap) M.delete NEM.delete prop_adjustWithKey :: Property prop_adjustWithKey = ttProp (gf2 valGen :?> GTKey :-> GTNEMap :-> TTNEMap) M.adjustWithKey NEM.adjustWithKey prop_updateWithKey :: Property prop_updateWithKey = ttProp (gf2 (Gen.maybe valGen) :?> GTKey :-> GTNEMap :-> TTMap) M.updateWithKey NEM.updateWithKey prop_updateLookupWithKey :: Property prop_updateLookupWithKey = ttProp (gf2 (Gen.maybe valGen) :?> GTKey :-> GTNEMap :-> TTMaybe TTVal :*: TTMap) M.updateLookupWithKey NEM.updateLookupWithKey prop_alter :: Property prop_alter = ttProp (gf1 (Gen.maybe valGen) :?> GTKey :-> GTNEMap :-> TTMap) M.alter NEM.alter prop_alter' :: Property prop_alter' = ttProp (gf1 valGen :?> GTKey :-> GTNEMap :-> TTNEMap) (M.alter . fmap Just) NEM.alter' prop_alterF :: Property prop_alterF = ttProp ( gf1 (Gen.maybe valGen) :?> GTKey :-> GTNEMap :-> TTCtx (GTMaybe GTVal :-> TTMap) (TTMaybe TTVal) ) (M.alterF . Context) (NEM.alterF . Context) prop_alterF_rules_Const :: Property prop_alterF_rules_Const = ttProp ( gf1 (Const <$> valGen) :?> GTKey :-> GTNEMap :-> TTOther ) (\f k m -> getConst (M.alterF f k m)) (\f k m -> getConst (NEM.alterF f k m)) prop_alterF_rules_Identity :: Property prop_alterF_rules_Identity = ttProp ( gf1 (Identity <$> Gen.maybe valGen) :?> GTKey :-> GTNEMap :-> TTMap ) (\f k m -> runIdentity (M.alterF f k m)) (\f k m -> runIdentity (NEM.alterF f k m)) prop_alterF' :: Property prop_alterF' = ttProp (gf1 valGen :?> GTKey :-> GTNEMap :-> TTCtx (GTVal :-> TTNEMap) (TTMaybe TTVal)) (M.alterF . Context . fmap Just) (NEM.alterF' . Context) prop_alterF'_rules_Const :: Property prop_alterF'_rules_Const = ttProp ( gf1 (Const <$> valGen) :?> GTKey :-> GTNEMap :-> TTOther ) (\f k m -> let f' = fmap Just . f in getConst (M.alterF f' k m)) (\f k m -> getConst (NEM.alterF' f k m)) -- -- | This fails, but isn't possible to fix without copying-and-pasting more -- -- in code from containers. -- prop_alterF'_rules_Identity :: Property -- prop_alterF'_rules_Identity = ttProp ( gf1 (Identity <$> valGen) -- :?> GTKey -- :-> GTNEMap -- :-> TTNEMap -- ) -- (\f k m -> let f' = fmap Just . f in runIdentity (M.alterF f' k m)) -- (\f k m -> runIdentity (NEM.alterF' f k m)) prop_lookup :: Property prop_lookup = ttProp (GTKey :-> GTNEMap :-> TTMaybe TTVal) M.lookup NEM.lookup prop_findWithDefault :: Property prop_findWithDefault = ttProp (GTVal :-> GTKey :-> GTNEMap :-> TTVal) M.findWithDefault NEM.findWithDefault prop_member :: Property prop_member = ttProp (GTKey :-> GTNEMap :-> TTOther) M.member NEM.member prop_notMember :: Property prop_notMember = ttProp (GTKey :-> GTNEMap :-> TTOther) M.notMember NEM.notMember prop_lookupLT :: Property prop_lookupLT = ttProp (GTKey :-> GTNEMap :-> TTMaybe (TTKey :*: TTVal)) M.lookupLT NEM.lookupLT prop_lookupGT :: Property prop_lookupGT = ttProp (GTKey :-> GTNEMap :-> TTMaybe (TTKey :*: TTVal)) M.lookupGT NEM.lookupGT prop_lookupLE :: Property prop_lookupLE = ttProp (GTKey :-> GTNEMap :-> TTMaybe (TTKey :*: TTVal)) M.lookupLE NEM.lookupLE prop_lookupGE :: Property prop_lookupGE = ttProp (GTKey :-> GTNEMap :-> TTMaybe (TTKey :*: TTVal)) M.lookupGE NEM.lookupGE prop_size :: Property prop_size = ttProp (GTNEMap :-> TTOther) M.size NEM.size prop_union :: Property prop_union = ttProp (GTNEMap :-> GTNEMap :-> TTNEMap) M.union NEM.union prop_unionWith :: Property prop_unionWith = ttProp (gf2 valGen :?> GTNEMap :-> GTNEMap :-> TTNEMap) M.unionWith NEM.unionWith prop_unionWithKey :: Property prop_unionWithKey = ttProp (gf3 valGen :?> GTNEMap :-> GTNEMap :-> TTNEMap) M.unionWithKey NEM.unionWithKey prop_unions :: Property prop_unions = ttProp (GTNEList (Just (Range.linear 2 5)) GTNEMap :-> TTNEMap) M.unions NEM.unions prop_unionsWith :: Property prop_unionsWith = ttProp (gf2 valGen :?> GTNEList (Just (Range.linear 2 5)) GTNEMap :-> TTNEMap) M.unionsWith NEM.unionsWith prop_difference :: Property prop_difference = ttProp (GTNEMap :-> GTNEMap :-> TTMap) M.difference NEM.difference prop_differenceWithKey :: Property prop_differenceWithKey = ttProp (gf3 (Gen.maybe valGen) :?> GTNEMap :-> GTNEMap :-> TTMap) M.differenceWithKey NEM.differenceWithKey prop_intersection :: Property prop_intersection = ttProp (GTNEMap :-> GTNEMap :-> TTMap) M.intersection NEM.intersection prop_intersectionWithKey :: Property prop_intersectionWithKey = ttProp (gf3 valGen :?> GTNEMap :-> GTNEMap :-> TTMap) M.intersectionWithKey NEM.intersectionWithKey prop_map :: Property prop_map = ttProp (gf1 valGen :?> GTNEMap :-> TTNEMap) M.map NEM.map prop_map_rules_map :: Property prop_map_rules_map = ttProp (gf1 valGen :?> gf1 valGen :?> GTNEMap :-> TTNEMap) (\f g xs -> M.map f (M.map g xs)) (\f g xs -> NEM.map f (NEM.map g xs)) prop_map_rules_coerce :: Property prop_map_rules_coerce = ttProp (GTNEMap :-> TTNEMap) (M.map @Text @Text coerce) (NEM.map @Text @Text coerce) prop_map_rules_mapWithKey :: Property prop_map_rules_mapWithKey = ttProp (gf1 valGen :?> gf2 valGen :?> GTNEMap :-> TTNEMap) (\f g xs -> M.map f (M.mapWithKey g xs)) (\f g xs -> NEM.map f (NEM.mapWithKey g xs)) prop_mapWithKey :: Property prop_mapWithKey = ttProp (gf2 valGen :?> GTNEMap :-> TTNEMap) M.mapWithKey NEM.mapWithKey prop_mapWithKey_rules_mapWithKey :: Property prop_mapWithKey_rules_mapWithKey = ttProp (gf2 valGen :?> gf2 valGen :?> GTNEMap :-> TTNEMap) (\f g xs -> M.mapWithKey f (M.mapWithKey g xs)) (\f g xs -> NEM.mapWithKey f (NEM.mapWithKey g xs)) prop_mapWithKey_rules_map :: Property prop_mapWithKey_rules_map = ttProp (gf2 valGen :?> gf1 valGen :?> GTNEMap :-> TTNEMap) (\f g xs -> M.mapWithKey f (M.map g xs)) (\f g xs -> NEM.mapWithKey f (NEM.map g xs)) prop_traverseWithKey1 :: Property prop_traverseWithKey1 = ttProp (gf2 valGen :?> GTNEMap :-> TTBazaar GTVal TTNEMap TTVal) (\f -> M.traverseWithKey (\k -> (`More` Done (f k)))) (\f -> NEM.traverseWithKey1 (\k -> (`More` Done (f k)))) prop_traverseWithKey :: Property prop_traverseWithKey = ttProp (gf2 valGen :?> GTNEMap :-> TTBazaar GTVal TTNEMap TTVal) (\f -> M.traverseWithKey (\k -> (`More` Done (f k)))) (\f -> NEM.traverseWithKey (\k -> (`More` Done (f k)))) prop_traverseMaybeWithKey1 :: Property prop_traverseMaybeWithKey1 = ttProp (gf2 valGen :?> GTNEMap :-> TTBazaar (GTMaybe GTVal) TTMap TTVal) (\f -> M.traverseMaybeWithKey (\k -> (`More` Done (fmap (f k))))) (\f -> NEM.traverseMaybeWithKey1 (\k -> (`More` Done (fmap (f k))))) prop_traverseMaybeWithKey :: Property prop_traverseMaybeWithKey = ttProp (gf2 valGen :?> GTNEMap :-> TTBazaar (GTMaybe GTVal) TTMap TTVal) (\f -> M.traverseMaybeWithKey (\k -> (`More` Done (fmap (f k))))) (\f -> NEM.traverseMaybeWithKey (\k -> (`More` Done (fmap (f k))))) prop_sequence1 :: Property prop_sequence1 = ttProp (GTNEMap :-> TTBazaar GTVal TTNEMap TTVal) (sequenceA . fmap (`More` Done id)) (sequence1 . fmap (`More` Done id)) prop_sequenceA :: Property prop_sequenceA = ttProp (GTNEMap :-> TTBazaar GTVal TTNEMap TTVal) (sequenceA . fmap (`More` Done id)) (sequenceA . fmap (`More` Done id)) prop_mapAccumWithKey :: Property prop_mapAccumWithKey = ttProp ( gf3 ((,) <$> valGen <*> valGen) :?> GTOther valGen :-> GTNEMap :-> TTOther :*: TTNEMap ) M.mapAccumWithKey NEM.mapAccumWithKey prop_mapAccumRWithKey :: Property prop_mapAccumRWithKey = ttProp ( gf3 ((,) <$> valGen <*> valGen) :?> GTOther valGen :-> GTNEMap :-> TTOther :*: TTNEMap ) M.mapAccumRWithKey NEM.mapAccumRWithKey prop_mapKeys :: Property prop_mapKeys = ttProp (gf1 keyGen :?> GTNEMap :-> TTNEMap) M.mapKeys NEM.mapKeys prop_mapKeysWith :: Property prop_mapKeysWith = ttProp ( gf2 valGen :?> gf1 keyGen :?> GTNEMap :-> TTNEMap ) M.mapKeysWith NEM.mapKeysWith prop_mapKeysMonotonic :: Property prop_mapKeysMonotonic = ttProp (GF valGen go :?> GTNEMap :-> TTNEMap) M.mapKeysMonotonic NEM.mapKeysMonotonic where go f (K i t) = K (i * 2) (f t) prop_foldr :: Property prop_foldr = ttProp ( gf2 valGen :?> GTOther valGen :-> GTNEMap :-> TTOther ) M.foldr NEM.foldr prop_foldl :: Property prop_foldl = ttProp ( gf2 valGen :?> GTOther valGen :-> GTNEMap :-> TTOther ) M.foldl NEM.foldl prop_foldr1 :: Property prop_foldr1 = ttProp ( gf2 valGen :?> GTNEMap :-> TTOther ) foldr1 NEM.foldr1 prop_foldl1 :: Property prop_foldl1 = ttProp ( gf2 valGen :?> GTNEMap :-> TTOther ) foldl1 NEM.foldl1 prop_foldrWithKey :: Property prop_foldrWithKey = ttProp ( gf3 valGen :?> GTOther valGen :-> GTNEMap :-> TTOther ) M.foldrWithKey NEM.foldrWithKey prop_foldlWithKey :: Property prop_foldlWithKey = ttProp ( gf3 valGen :?> GTOther valGen :-> GTNEMap :-> TTOther ) M.foldlWithKey NEM.foldlWithKey prop_foldMapWithKey :: Property prop_foldMapWithKey = ttProp (gf2 valGen :?> GTNEMap :-> TTOther) M.foldMapWithKey NEM.foldMapWithKey prop_foldr' :: Property prop_foldr' = ttProp ( gf2 valGen :?> GTOther valGen :-> GTNEMap :-> TTOther ) M.foldr' NEM.foldr' prop_foldl' :: Property prop_foldl' = ttProp ( gf2 valGen :?> GTOther valGen :-> GTNEMap :-> TTOther ) M.foldl' NEM.foldl' prop_foldr1' :: Property prop_foldr1' = ttProp ( gf2 valGen :?> GTNEMap :-> TTOther ) foldr1 NEM.foldr1' prop_foldl1' :: Property prop_foldl1' = ttProp ( gf2 valGen :?> GTNEMap :-> TTOther ) foldl1 NEM.foldl1' prop_foldrWithKey' :: Property prop_foldrWithKey' = ttProp ( gf3 valGen :?> GTOther valGen :-> GTNEMap :-> TTOther ) M.foldrWithKey' NEM.foldrWithKey' prop_foldlWithKey' :: Property prop_foldlWithKey' = ttProp ( gf3 valGen :?> GTOther valGen :-> GTNEMap :-> TTOther ) M.foldlWithKey' NEM.foldlWithKey' prop_elems :: Property prop_elems = ttProp (GTNEMap :-> TTNEList TTVal) M.elems NEM.elems prop_keys :: Property prop_keys = ttProp (GTNEMap :-> TTNEList TTKey) M.keys NEM.keys prop_assocs :: Property prop_assocs = ttProp (GTNEMap :-> TTNEList (TTKey :*: TTVal)) M.assocs NEM.assocs prop_keysSet :: Property prop_keysSet = ttProp (GTNEMap :-> TTNESet) M.keysSet NEM.keysSet prop_toList :: Property prop_toList = ttProp (GTNEMap :-> TTNEList (TTKey :*: TTVal)) M.toList NEM.toList prop_toDescList :: Property prop_toDescList = ttProp (GTNEMap :-> TTNEList (TTKey :*: TTVal)) M.toDescList NEM.toDescList prop_filter :: Property prop_filter = ttProp (gf1 Gen.bool :?> GTNEMap :-> TTMap) M.filter NEM.filter prop_filterWithKey :: Property prop_filterWithKey = ttProp (gf2 Gen.bool :?> GTNEMap :-> TTMap) M.filterWithKey NEM.filterWithKey prop_restrictKeys :: Property prop_restrictKeys = ttProp (GTNEMap :-> GTSet :-> TTMap) M.restrictKeys NEM.restrictKeys prop_withoutKeys :: Property prop_withoutKeys = ttProp (GTNEMap :-> GTSet :-> TTMap) M.withoutKeys NEM.withoutKeys prop_partitionWithKey :: Property prop_partitionWithKey = ttProp (gf2 Gen.bool :?> GTNEMap :-> TTThese TTNEMap TTNEMap) M.partitionWithKey NEM.partitionWithKey prop_takeWhileAntitone :: Property prop_takeWhileAntitone = ttProp (GTNEMap :-> TTMap) (M.takeWhileAntitone ((< 0) . getKX)) (NEM.takeWhileAntitone ((< 0) . getKX)) prop_dropWhileAntitone :: Property prop_dropWhileAntitone = ttProp (GTNEMap :-> TTMap) (M.dropWhileAntitone ((< 0) . getKX)) (NEM.dropWhileAntitone ((< 0) . getKX)) prop_spanAntitone :: Property prop_spanAntitone = ttProp (GTNEMap :-> TTThese TTNEMap TTNEMap) (M.spanAntitone ((< 0) . getKX)) (NEM.spanAntitone ((< 0) . getKX)) prop_mapMaybeWithKey :: Property prop_mapMaybeWithKey = ttProp (gf2 (Gen.maybe valGen) :?> GTNEMap :-> TTMap) M.mapMaybeWithKey NEM.mapMaybeWithKey prop_mapEitherWithKey :: Property prop_mapEitherWithKey = ttProp ( gf2 (Gen.choice [Left <$> valGen, Right <$> valGen]) :?> GTNEMap :-> TTThese TTNEMap TTNEMap ) M.mapEitherWithKey NEM.mapEitherWithKey prop_split :: Property prop_split = ttProp (GTKey :-> GTNEMap :-> TTMThese TTNEMap TTNEMap) M.split NEM.split prop_splitLookup :: Property prop_splitLookup = ttProp (GTKey :-> GTNEMap :-> TTTThese TTVal TTNEMap TTNEMap) (\k -> (\(x,y,z) -> (y,x,z)) . M.splitLookup k) NEM.splitLookup prop_isSubmapOfBy :: Property prop_isSubmapOfBy = ttProp (gf2 Gen.bool :?> GTNEMap :-> GTNEMap :-> TTOther) M.isSubmapOfBy NEM.isSubmapOfBy prop_isProperSubmapOfBy :: Property prop_isProperSubmapOfBy = ttProp (gf2 Gen.bool :?> GTNEMap :-> GTNEMap :-> TTOther) M.isProperSubmapOfBy NEM.isProperSubmapOfBy prop_lookupIndex :: Property prop_lookupIndex = ttProp (GTKey :-> GTNEMap :-> TTMaybe TTOther) M.lookupIndex NEM.lookupIndex prop_elemAt :: Property prop_elemAt = ttProp (GTSize :-> GTNEMap :-> TTKey :*: TTVal) (\i m -> M.elemAt (i `mod` M.size m) m) (\i m -> NEM.elemAt (i `mod` NEM.size m) m) prop_adjustAt :: Property prop_adjustAt = ttProp (gf2 valGen :?> GTSize :-> GTNEMap :-> TTNEMap) (\f i m -> M.updateAt (\k -> Just . f k) (i `mod` M.size m) m) (\f i m -> NEM.adjustAt f (i `mod` NEM.size m) m) prop_updateAt :: Property prop_updateAt = ttProp (gf2 (Gen.maybe valGen) :?> GTSize :-> GTNEMap :-> TTMap) (\f i m -> M.updateAt f (i `mod` M.size m) m) (\f i m -> NEM.updateAt f (i `mod` NEM.size m) m) prop_deleteAt :: Property prop_deleteAt = ttProp (GTSize :-> GTNEMap :-> TTMap) (\i m -> M.deleteAt (i `mod` M.size m) m) (\i m -> NEM.deleteAt (i `mod` NEM.size m) m) prop_take :: Property prop_take = ttProp (GTSize :-> GTNEMap :-> TTMap) M.take NEM.take prop_drop :: Property prop_drop = ttProp (GTSize :-> GTNEMap :-> TTMap) M.drop NEM.drop prop_splitAt :: Property prop_splitAt = ttProp (GTSize :-> GTNEMap :-> TTThese TTNEMap TTNEMap) M.splitAt NEM.splitAt prop_findMin :: Property prop_findMin = ttProp (GTNEMap :-> TTKey :*: TTVal) M.findMin NEM.findMin prop_findMax :: Property prop_findMax = ttProp (GTNEMap :-> TTKey :*: TTVal) M.findMax NEM.findMax prop_deleteMin :: Property prop_deleteMin = ttProp (GTNEMap :-> TTMap) M.deleteMin NEM.deleteMin prop_deleteMax :: Property prop_deleteMax = ttProp (GTNEMap :-> TTMap) M.deleteMax NEM.deleteMax prop_deleteFindMin :: Property prop_deleteFindMin = ttProp (GTNEMap :-> (TTKey :*: TTVal) :*: TTMap) M.deleteFindMin NEM.deleteFindMin prop_deleteFindMax :: Property prop_deleteFindMax = ttProp (GTNEMap :-> (TTKey :*: TTVal) :*: TTMap) M.deleteFindMax NEM.deleteFindMax prop_updateMinWithKey :: Property prop_updateMinWithKey = ttProp (gf2 (Gen.maybe valGen) :?> GTNEMap :-> TTMap) M.updateMinWithKey NEM.updateMinWithKey prop_updateMaxWithKey :: Property prop_updateMaxWithKey = ttProp (gf2 (Gen.maybe valGen) :?> GTNEMap :-> TTMap) M.updateMaxWithKey NEM.updateMaxWithKey prop_adjustMinWithKey :: Property prop_adjustMinWithKey = ttProp (gf2 valGen :?> GTNEMap :-> TTNEMap) (M.updateMinWithKey . (fmap . fmap) Just) NEM.adjustMinWithKey prop_adjustMaxWithKey :: Property prop_adjustMaxWithKey = ttProp (gf2 valGen :?> GTNEMap :-> TTNEMap) (M.updateMaxWithKey . (fmap . fmap) Just) NEM.adjustMaxWithKey prop_minView :: Property prop_minView = ttProp (GTNEMap :-> TTMaybe (TTVal :*: TTMap)) M.minView (Just . NEM.minView) prop_maxView :: Property prop_maxView = ttProp (GTNEMap :-> TTMaybe (TTVal :*: TTMap)) M.maxView (Just . NEM.maxView) prop_elem :: Property prop_elem = ttProp (GTVal :-> GTNEMap :-> TTOther) elem elem prop_fold1 :: Property prop_fold1 = ttProp (GTNEMap :-> TTVal) fold fold1 prop_fold :: Property prop_fold = ttProp (GTNEMap :-> TTVal) fold fold prop_foldMap1 :: Property prop_foldMap1 = ttProp (gf1 valGen :?> GTNEMap :-> TTOther) (\f -> foldMap ((:[]) . f)) (\f -> foldMap1 ((:[]) . f)) prop_foldMap :: Property prop_foldMap = ttProp (gf1 valGen :?> GTNEMap :-> TTOther) (\f -> foldMap ((:[]) . f)) (\f -> foldMap ((:[]) . f))