]> git.rkrishnan.org Git - functorrent.git/commitdiff
pickPiece: a simple algorithm to download the pieces in order
authorRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Fri, 24 Jul 2015 08:36:18 +0000 (14:06 +0530)
committerRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Fri, 24 Jul 2015 08:36:21 +0000 (14:06 +0530)
src/FuncTorrent/Peer.hs

index 2130ffe3d506596fa440f3fb627e39da9c95623a..4da3d0b3b17ec1e7a2a005d4d39f859932e2eeb8 100644 (file)
@@ -18,7 +18,7 @@ import Control.Monad (replicateM, liftM, forever)
 import Control.Applicative ((<$>), liftA3)
 import Data.Bits
 import Data.Word (Word8)
-import Data.Map (Map(..), fromList, (!), mapWithKey)
+import Data.Map (Map(..), fromList, toList, (!), mapWithKey)
 
 import FuncTorrent.Metainfo (Info(..), Metainfo(..))
 import FuncTorrent.Utils (splitN)
@@ -227,6 +227,17 @@ msgLoop state pieceStatus = do
        _ -> do
          msgLoop state pieceStatus
 
+-- simple algorithm to pick piece.
+-- pick the first piece from 0 that is not downloaded yet.
+pickPiece :: PieceMap -> Maybe Integer
+pickPiece m =
+  let pieceList = toList m
+      allPending = filter (\(k, v) -> state v == Pending) pieceList
+  in
+   case allPending of
+    [] -> Nothing
+    ((i, _):_) -> Just i
+
 updatePieceAvailability :: PieceMap -> Peer -> [Integer] -> PieceMap
 updatePieceAvailability pieceStatus p pieceList =
   mapWithKey (\k pd -> if k `elem` pieceList