Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module Main where
- import Control.Parallel
- import System.Environment
- import Prelude hiding (words)
- data WordState = Chunk String
- | Segment {left:: String, mid::[String], right::String}
- deriving (Eq,Show)
- (<+>) :: WordState -> WordState -> WordState
- (Chunk s) <+> (Chunk s') = Chunk $ s ++ s'
- (Chunk s) <+> (Segment lf mid rt) = Segment (s ++ lf) mid rt
- (Segment lf mid rt) <+> (Chunk s) = Segment lf mid $ rt ++ s
- (Segment lf mid rt) <+> (Segment lf' mid' rt') =
- Segment lf (mid ++ (maybeWord $ rt ++ lf') ++ mid') rt'
- toWords (Chunk s) = [s]
- toWords (Segment lf mid rt) = maybeWord lf ++ mid ++ maybeWord rt
- words s = toWords $ words' s
- where
- words' s = if length s < 1000 then
- (<+>) `foldl1` (processChar `map` s)
- else
- wleft `par` (wright `pseq` wleft <+> wright)
- where
- wright = words' right
- wleft = words' left
- (left,right) = splitAt (length s `div` 2) s
- processChar ' ' = Segment "" [] ""
- processChar c = Chunk [c]
- maybeWord "" = []
- maybeWord s = [s]
- main = do
- args <- getArgs
- let file = args !! 0
- content <- readFile file
- let text = concat $ take 10 $ repeat content
- putStrLn $ show $ length $ words text
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement