Skip to content

Instantly share code, notes, and snippets.

@eagletmt
Created April 19, 2009 09:59
Show Gist options
  • Save eagletmt/98000 to your computer and use it in GitHub Desktop.
Save eagletmt/98000 to your computer and use it in GitHub Desktop.
{-# LANGUAGE ScopedTypeVariables #-}
module Main where
import Network.HTTP
import Text.JSON
import System.IO.UTF8 as U
data Feed = Feed (JSObject JSValue)
stringFromObj :: String -> JSObject JSValue -> String
stringFromObj s obj = let Ok (v::JSString) = valFromObj s obj in fromJSString v
urlFromFeed :: Feed -> String
urlFromFeed (Feed obj) = stringFromObj "u" obj
titleFromFeed :: Feed -> String
titleFromFeed (Feed obj) = stringFromObj "d" obj
dtFromFeed :: Feed -> String
dtFromFeed (Feed obj) = stringFromObj "dt" obj
tagsFromFeed :: Feed -> [String]
tagsFromFeed (Feed obj) = stringArrayFromObj "t" obj
where
stringArrayFromObj :: String -> JSObject JSValue -> [String]
stringArrayFromObj s obj = let Ok (v::[JSString]) = valFromObj s obj in map fromJSString v
feedToHumanReadable :: Feed -> String
feedToHumanReadable feed =
"url: " ++ urlFromFeed feed ++ "\n"
++ "title: " ++ titleFromFeed feed ++ "\n"
++ "tags: " ++ (show $ tagsFromFeed feed) ++ "\n"
++ "dt: " ++ dtFromFeed feed ++ "\n"
getDeliciousFeed :: Int -> IO [Feed]
getDeliciousFeed count =
simpleHTTP (getRequest (baseUrl ++ show count)) >>= getResponseBody >>= return . toFeed
where
baseUrl = "http://feeds.delicious.com/v2/json?count="
toFeed :: String -> [Feed]
toFeed str = let Ok feeds = decodeStrict str in map Feed feeds
main = getDeliciousFeed 5 >>= mapM_ (U.putStrLn . feedToHumanReadable)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment