Guest User

Untitled

a guest
Feb 18th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.57 KB | None | 0 0
  1. module Break
  2. ( breakEnd
  3. , breakSep
  4. , prop_breakEnd_sepPred
  5. , prop_breakEnd_constPred
  6. , prop_breakSep_firstSep
  7. , prop_breakSep_falsePred
  8. , prop_breakSep_truePred
  9. , prop_breakSep_generalizesBreak
  10. )
  11. where
  12.  
  13. import Control.Arrow
  14. import qualified Data.ByteString as BS
  15. import Data.Maybe
  16. import Data.Word
  17. import Test.QuickCheck
  18.  
  19. breakEnd :: (a -> Bool) -> [a] -> ([a], [a])
  20. breakEnd p xs =
  21. case breakSep p xs of
  22. (pre, Just (s, post)) -> first ((pre++) . (s:)) . breakEnd p $ post
  23. (post, Nothing) -> ([], post)
  24.  
  25. breakSep :: (a -> Bool) -> [a] -> ([a], Maybe (a, [a]))
  26. breakSep p (x:xs)
  27. | p x = ([], Just (x, xs))
  28. | otherwise = first (x:) . breakSep p $ xs
  29. breakSep _ e@[] = (e, Nothing)
  30.  
  31. prop_breakEnd_sepPred :: [Word8] -> Word8 -> [Word8] -> Property
  32. prop_breakEnd_sepPred pre sep post =
  33. breakEnd_matches "prop_breakEnd_sepPred: "
  34. (== sep) (pre ++ [sep] ++ post)
  35.  
  36. prop_breakEnd_constPred :: Bool -> [Word8] -> Property
  37. prop_breakEnd_constPred b xs =
  38. breakEnd_matches "prop_breakEnd_constPred: "
  39. (const b) xs
  40.  
  41. breakEnd_matches :: String -> (Word8 -> Bool) -> [Word8] -> Property
  42. breakEnd_matches prefix p str =
  43. assert prefix (==)
  44. ((BS.unpack *** BS.unpack) $ BS.breakEnd p (BS.pack str))
  45. (breakEnd p $ str)
  46.  
  47. prop_breakSep_firstSep :: [Word8] -> Word8 -> [Word8] -> Property
  48. prop_breakSep_firstSep pre sep post =
  49. not (sep `elem` pre) ==>
  50. assert "prop_breakSep_firstSep: " (==)
  51. (pre, Just (sep, post))
  52. (breakSep (== sep) (pre ++ [sep] ++ post))
  53.  
  54. prop_breakSep_falsePred :: [Word8] -> Property
  55. prop_breakSep_falsePred xs =
  56. assert "prop_breakSep_falsePred: " (==)
  57. (xs, Nothing) (breakSep (const False) xs)
  58.  
  59. prop_breakSep_truePred :: [Word8] -> Property
  60. prop_breakSep_truePred xs@(x:xs') =
  61. assert "prop_breakSep_truePred: " (==)
  62. ([], Just (x, xs')) (breakSep (const True) xs)
  63. prop_breakSep_truePred xs@[] =
  64. assert "prop_breakSep_truePred: " (==)
  65. ([], Nothing) (breakSep (const True) xs)
  66.  
  67. prop_breakSep_generalizesBreak :: [Word8] -> Word8 -> [Word8] -> Property
  68. prop_breakSep_generalizesBreak pre sep post =
  69. not (sep `elem` pre) ==>
  70. assert "prop_breakSep_generalizesBreak: " (==)
  71. (break (== sep) str)
  72. (second (uncurry (:) . fromJust) . breakSep (== sep) $ str)
  73. where
  74. str = pre ++ [sep] ++ post
  75.  
  76. assert :: Show a => String -> (a -> a -> Bool) -> a -> a -> Property
  77. assert prefix op expected actual =
  78. let message = prefix ++ "Expected " ++ show expected
  79. ++ ", got " ++ show actual
  80. in printTestCase message (expected `op` actual)
Add Comment
Please, Sign In to add comment