summaryrefslogtreecommitdiff
path: root/src/Network/BitTorrent/PeerWire/Bitfield.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Network/BitTorrent/PeerWire/Bitfield.hs')
-rw-r--r--src/Network/BitTorrent/PeerWire/Bitfield.hs12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/Network/BitTorrent/PeerWire/Bitfield.hs b/src/Network/BitTorrent/PeerWire/Bitfield.hs
index 2baeb516..9d88e784 100644
--- a/src/Network/BitTorrent/PeerWire/Bitfield.hs
+++ b/src/Network/BitTorrent/PeerWire/Bitfield.hs
@@ -18,6 +18,7 @@ module Network.BitTorrent.PeerWire.Bitfield
18 18
19 -- * Construction 19 -- * Construction
20 , empty, full 20 , empty, full
21 , toList
21 , fromByteString, toByteString 22 , fromByteString, toByteString
22 23
23 -- * Query 24 -- * Query
@@ -62,6 +63,13 @@ full :: Int -> Bitfield
62full n = MkBitfield $ B.replicate (sizeInBase n 8) (complement 0) 63full n = MkBitfield $ B.replicate (sizeInBase n 8) (complement 0)
63{-# INLINE full #-} 64{-# INLINE full #-}
64 65
66toList :: Bitfield -> [Bool]
67toList (MkBitfield bs) = concatMap unpkg (B.unpack bs)
68 where
69 unpkg :: Word8 -> [Bool]
70 unpkg byte = L.map (testBit byte) [0..bitSize (undefined :: Word8) - 1]
71{-# INLINE toList #-}
72
65fromByteString :: ByteString -> Bitfield 73fromByteString :: ByteString -> Bitfield
66fromByteString = MkBitfield 74fromByteString = MkBitfield
67{-# INLINE fromByteString #-} 75{-# INLINE fromByteString #-}
@@ -278,5 +286,5 @@ findMax (MkBitfield b) = do
278 286
279{-# INLINE findMax #-} 287{-# INLINE findMax #-}
280 288
281frequencies :: [Bitfield] -> UArray PieceIx Int 289frequencies :: [Bitfield] -> [Int]
282frequencies = undefined 290frequencies xs = foldr1 (zipWith (+)) $ map (map fromEnum . toList) xs