Changeset 14478 for src/Pugs/Prim/List.hs
- Timestamp:
- 10/22/06 01:38:03 (2 years ago)
- svk:copy_cache_prev:
- 21625
- Files:
-
- 1 modified
-
src/Pugs/Prim/List.hs (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Prim/List.hs
r14467 r14478 393 393 env <- ask 394 394 liftIO $ do 395 chan <- newChan 396 forM ([(0::Int)..] `zip` xs) $ \(n, x) -> forkIO $ do 397 rv <- runEvalIO env $ doHyper x 398 writeChan chan (n, rv) 399 fmap (map snd . sort) (replicateM (length xs) (readChan chan)) 395 mvs <- forM xs $ \x -> do 396 mv <- newEmptyMVar 397 forkIO $ do 398 val <- runEvalIO env (doHyper x) 399 putMVar mv val 400 return mv 401 mapM takeMVar mvs 400 402 401 403 op1HyperPostfix :: VCode -> Val -> Eval Val … … 435 437 env <- ask 436 438 liftIO $ do 437 chan <- newChan 438 len <- doHyperLists env chan 0 xs ys 439 fmap (map snd . sort) (replicateM len (readChan chan)) 440 doHyperLists :: Env -> Chan (Int, Val) -> Int -> [Val] -> [Val] -> IO Int 441 doHyperLists _ _ n [] [] = return n 442 doHyperLists _ chan n xs [] = do 443 forM ([n..] `zip` xs) (writeChan chan) 444 return (n + length xs) 445 doHyperLists _ chan n [] ys = do 446 forM ([n..] `zip` ys) (writeChan chan) 447 return (n + length ys) 448 doHyperLists env chan n (x:xs) (y:ys) = do 439 mvs <- doHyperLists env xs ys 440 mapM takeMVar mvs 441 doHyperLists _ [] [] = return [] 442 doHyperLists _ xs [] = mapM newMVar xs 443 doHyperLists _ [] ys = mapM newMVar ys 444 doHyperLists env (x:xs) (y:ys) = do 445 mv <- newEmptyMVar 449 446 forkIO $ do 450 rv <- runEvalIO env $ doHyper x y 451 writeChan chan (n, rv) 452 doHyperLists env chan (n+1) xs ys 447 val <- runEvalIO env $ doHyper x y 448 putMVar mv val 449 mvs <- doHyperLists env xs ys 450 return (mv:mvs)
