module Test.Hspec.Expectations.Matcher (matchList) where import Prelude hiding (showList) import Data.List matchList :: (Show a, Eq a) => [a] -> [a] -> Maybe String xs `matchList` ys | null extra && null missing = Nothing | otherwise = Just (err "") where extra = xs \\ ys missing = ys \\ xs msgAndList msg zs = showString msg . showList zs . showString "\n" optMsgList msg zs = if null zs then id else msgAndList msg zs err :: ShowS err = showString "Actual list is not a permutation of expected list!\n" . msgAndList " expected list contains: " ys . msgAndList " actual list contains: " xs . optMsgList " the missing elements are: " missing . optMsgList " the extra elements are: " extra showList :: Show a => [a] -> ShowS showList xs = showChar '[' . foldr (.) (showChar ']') (intersperse (showString ", ") $ map shows xs)