-- | This module provides functions for testing invariants and -- properties on the uniquely-represented sets. module Data.Set.Unique.Properties where import Data.Set.Unique import qualified Data.Tree.Braun.Sized as Braun import qualified Data.Tree.Braun.Sized.Properties as Braun import Data.Foldable import Data.List (sortBy) import Data.Functor.Classes -- | Check that the sizes of the inner Braun trees obey the size -- bound. sizesInBound :: Set a -> Bool sizesInBound (Set b) = null xs || it && re where xs = toList b it = and $ zipWith (\x y -> Braun.size x == szfn y) (safeInit xs) [1..] safeInit [] = [] safeInit ys = init ys re = Braun.size (last xs) <= szfn (length xs) -- | Check that all inner trees are Braun trees. allBraun :: Set a -> Bool allBraun (Set b) = Braun.isBraun b && all Braun.isBraun b -- | Check that the elements are stored in the correct order. inOrder :: (a -> a -> Ordering) -> Set a -> Bool inOrder cmp xs = liftEq (\x y -> cmp x y == EQ) ys (sortBy cmp ys) where ys = toList xs -- | Check that all inner trees store the correct size. allCorrectSizes :: Set a -> Bool allCorrectSizes (Set b) = Braun.validSize b && all Braun.validSize b -- | Check that the stored size is correct. validSize :: Set a -> Bool validSize s = length s == foldl' (\a _ -> a + 1) 0 s