Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module Main where
  2.  
  3. import Control.Parallel
  4. import System.Environment
  5. import Prelude hiding (words)
  6.  
  7. data WordState = Chunk String
  8.                | Segment {left:: String, mid::[String], right::String}
  9.                  deriving (Eq,Show)
  10.                          
  11. (<+>) :: WordState -> WordState -> WordState
  12. (Chunk s) <+> (Chunk s') = Chunk $ s ++ s'
  13. (Chunk s) <+> (Segment lf mid rt) = Segment (s ++ lf) mid rt
  14. (Segment lf mid rt) <+> (Chunk s) = Segment lf mid $ rt ++ s
  15. (Segment lf mid rt) <+> (Segment lf' mid' rt') =
  16.  Segment lf (mid ++ (maybeWord $ rt ++ lf') ++ mid') rt'
  17.  
  18. toWords (Chunk s) = [s]
  19. toWords (Segment lf mid rt) = maybeWord lf ++ mid ++ maybeWord rt
  20.  
  21. words s = toWords $ words' s
  22.  where
  23.    words' s = if length s < 1000 then
  24.                  (<+>) `foldl1` (processChar `map` s)
  25.                else
  26.                  wleft `par` (wright `pseq` wleft <+> wright)
  27.                    where
  28.                      wright       = words' right
  29.                     wleft        = words' left
  30.                      (left,right) = splitAt (length s `div` 2) s
  31.     processChar ' ' = Segment "" [] ""
  32.     processChar c   = Chunk [c]
  33. maybeWord "" = []
  34. maybeWord s = [s]
  35.  
  36. main = do
  37.   args <- getArgs
  38.   let file = args !! 0
  39.   content <- readFile file
  40.   let text = concat $ take 10 $ repeat content
  41.   putStrLn $ show $ length $ words text
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement