Follow up #21. Applying fmap (alternative) on getters
authorAbhiranjan Kumar <abhiranjan.kumar00@gmail.com>
Sun, 12 Apr 2015 21:35:51 +0000 (03:05 +0530)
committerAbhiranjan Kumar <abhiranjan.kumar00@gmail.com>
Mon, 13 Apr 2015 11:41:07 +0000 (17:11 +0530)
src/FuncTorrent/Bencode.hs
src/FuncTorrent/Metainfo.hs

index 96600e2aa620e16c32de126e530ec9cabc846f1f..bbeca650a6eca2c8a9b78050f5671ec36de418a9 100644 (file)
@@ -1,10 +1,14 @@
 {-# LANGUAGE OverloadedStrings #-}
-module FuncTorrent.Bencode
-    (BVal(..),
-     InfoDict,
-     bstrToString,
-     encode,
-     decode
+module FuncTorrent.Bencode (
+      BVal(..)
+    , InfoDict
+    , bstrToString
+    , bValToInteger
+    , bValToInfoDict
+    , bValToBList
+    , bValToBstr
+    , encode
+    , decode
     ) where
 
 import Prelude hiding (length, concat)
@@ -23,6 +27,26 @@ data BVal = Bint Integer
           | Bdict InfoDict
             deriving (Ord, Eq, Show)
 
+-- getters
+bValToInteger :: BVal -> Maybe Integer
+bValToInteger (Bint x) = Just x
+bValToInteger _        = Nothing
+
+bValToBstr :: BVal  -> Maybe ByteString
+bValToBstr (Bstr bs) = Just bs
+bValToBstr _         = Nothing
+
+bValToBList :: BVal    -> Maybe [BVal]
+bValToBList (Blist lst) = Just lst
+bValToBList _           = Nothing
+
+bValToInfoDict :: BVal     -> Maybe InfoDict
+bValToInfoDict (Bdict dict) = Just dict
+bValToInfoDict _            = Nothing
+
+bstrToString :: BVal -> Maybe String
+bstrToString bval     = unpack <$> bValToBstr bval
+
 type InfoDict = Map String BVal
 
 -- $setup
@@ -140,8 +164,3 @@ encode (Bstr bs) = pack $ show (length bs) ++ ":" ++ unpack bs
 encode (Bint i) = pack $ "i" ++ show i ++ "e"
 encode (Blist xs) = pack $ "l" ++ unpack (concat $ map encode xs) ++ "e"
 encode (Bdict d) = concat [concat ["d", encode . Bstr . pack $ k , encode (d ! k) , "e"] | k <- keys d]
-
--- getters
-bstrToString :: BVal -> Maybe String
-bstrToString (Bstr s) = Just $ unpack s
-bstrToString _ = Nothing
index dfedb59dbdd3d57cf3643348d9e70e287f2192d0..1695b596f902e20acd15c0233134d55825028b72 100644 (file)
@@ -12,7 +12,7 @@ import Data.Map as M ((!), lookup)
 import Crypto.Hash.SHA1 (hash)
 import Data.Maybe (maybeToList)
 
-import FuncTorrent.Bencode (BVal(..), InfoDict, encode, bstrToString)
+import FuncTorrent.Bencode (BVal(..), InfoDict, encode, bstrToString, bValToInteger)
 
 -- only single file mode supported for the time being.
 data Info = Info { pieceLength :: !Integer
@@ -46,30 +46,24 @@ mkInfo (Bdict m) = let (Bint pieceLength') = m ! "piece length"
                                 , md5sum = md5sum'}
 mkInfo _ = Nothing
 
-maybeBstrToString :: Maybe BVal -> Maybe String
-maybeBstrToString (Just (Bstr bs)) = Just $ unpack bs
-maybeBstrToString _ = Nothing
-
-maybeBstrToInteger :: Maybe BVal -> Maybe Integer
-maybeBstrToInteger (Just (Bint bs)) = Just  bs
-maybeBstrToInteger _ = Nothing
-
-mkMetaInfo :: BVal -> Maybe Metainfo
-mkMetaInfo (Bdict m) = let (Just info') = mkInfo $ m ! "info"
-                           announce' = lookup "announce" m
-                           announceList' = lookup "announce-list" m
-                           creationDate' = lookup "creation date" m
-                           comment' = lookup "comment" m
-                           createdBy' = lookup "created by" m
-                           encoding' = lookup "encoding" m
-                       in Just Metainfo { info = info'
-                                        , announceList = maybeToList (announce' >>= bstrToString)
-                                                         ++ getAnnounceList announceList'
-                                        , creationDate = maybeBstrToInteger creationDate'
-                                        , comment = maybeBstrToString comment'
-                                        , createdBy = maybeBstrToString createdBy'
-                                        , encoding = maybeBstrToString encoding'
-                                        }
+mkMetaInfo :: BVal   -> Maybe Metainfo
+mkMetaInfo (Bdict m)  =
+    let (Just info')  = mkInfo $ m ! "info"
+        announce'     = lookup "announce" m
+        announceList' = lookup "announce-list" m
+        creationDate' = lookup "creation date" m
+        comment'      = lookup "comment" m
+        createdBy'    = lookup "created by" m
+        encoding'     = lookup "encoding" m
+    in Just Metainfo {
+             info         = info'
+           , announceList = maybeToList (announce' >>= bstrToString)
+                            ++ getAnnounceList announceList'
+           , creationDate = bValToInteger =<< creationDate'
+           , comment      = bstrToString  =<< comment'
+           , createdBy    = bstrToString  =<< createdBy'
+           , encoding     = bstrToString  =<< encoding'
+        }
 mkMetaInfo _ = Nothing
 
 getAnnounceList :: Maybe BVal -> [String]