Show
Ignore:
Timestamp:
12/19/06 00:15:47 (2 years ago)
Author:
luqui
Message:

Made pick faster.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Prim/List.hs

    r14925 r14926  
    5959op1Pick v = retError "pick not defined" v 
    6060 
    61 shuffle :: [a] -> Eval [a] 
    62 shuffle [] = return [] 
    63 shuffle xs = do 
     61shuffleN :: Int -> [a] -> Eval [a] 
     62shuffleN _ [] = return [] 
     63shuffleN 0 _  = return [] 
     64shuffleN n xs = do 
    6465    -- pick the first element 
    6566    first <- liftIO $ randomRIO (0 :: Int, length xs - 1) 
    66     rest <- shuffle $ take first xs ++ drop (first+1) xs 
     67    rest <- shuffleN (n-1) $ take first xs ++ drop (first+1) xs 
    6768    return $ head (drop first xs) : rest 
    6869 
     
    7273    op2Pick ref num 
    7374op2Pick (VList xs) (VInt num) = do 
    74     shuffled <- shuffle xs 
    75     return $ VList $ take (fromInteger num) shuffled 
     75    shuffled <- shuffleN (fromInteger num) xs 
     76    return $ VList shuffled 
    7677op2Pick r _ = retError "pick not defined" r 
    7778