Skip to content

Instantly share code, notes, and snippets.

@dpwiz
Last active April 11, 2017 09:23
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save dpwiz/5140973 to your computer and use it in GitHub Desktop.
Save dpwiz/5140973 to your computer and use it in GitHub Desktop.
Haskell version of http://eax.me/scala/
import Data.Aeson
import Network.HTTP
import System.Environment (getArgs)
import Control.Monad (mapM_)
import Data.Maybe (fromMaybe)
import qualified Data.ByteString.Lazy.Char8 as LBS
import qualified Data.Text as T
import qualified Data.HashMap.Strict as HM
import qualified Data.Vector as V
main = do
args <- getArgs
case args of
[q] -> fetchTweets q
_ -> putStrLn "twitsearch <query>"
fetchTweets q = do
let req = getRequest $ "http://search.twitter.com/search.json?" ++ urlEncodeVars [("q", q)]
body <- simpleHTTP req >>= getResponseBody
let doc = fromMaybe Null . decode . LBS.pack $ body
let tweets = mapV (asString . key "text") . key "results" $ doc
mapM_ putStrLn tweets
-- Ad-Hoc JSON queries
key :: String -> Value -> Value
key k (Object o) = maybe Null id (HM.lookup (T.pack k) o)
key k _ = Null
mapV :: (Value -> a) -> Value -> [a]
mapV f (Array l) = map f (V.toList l)
mapV _ _ = []
asString :: Value -> String
asString (String t) = T.unpack t
asString x = show x
@dpwiz
Copy link
Author

dpwiz commented Mar 12, 2013

Кто бы научил меня избавляться от case-кадов при разборе структур...

@polachok
Copy link

Всегда можно что-нибудь смешное написать, типа:

https://gist.github.com/polachok/5154974

@dpwiz
Copy link
Author

dpwiz commented Mar 14, 2013

В принцпе, конкретно JSON ведь несёт уже в себе аналог Nothing, значит можно по-быстрому нашлёпать что-то похожее.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment