module Common where
import Data.List (nub, sort, group)
import Control.Arrow ((&&&))
import Data.PrimitiveArray.Index.Class
-- * generic functions
-- | Generates a list of, eg, @PointL@s. This are then grouped according to
-- the @linearIndex@. Within each group, there should only be @PointL@s
-- with the same value.
uniquenessTest :: (Ord a, Index a) => a -> [a] -> Bool
uniquenessTest low xs = all allEq ys && all allEq zs
where hgh = maximum xs
ys = group . sort . map (linearIndex low hgh &&& id) $ xs
zs = group . sort . map (id &&& linearIndex low hgh) $ xs
-- | are all @xs@ equal to each other
allEq [] = True
allEq (x:xs) = all (x==) xs