Skip to content

Instantly share code, notes, and snippets.

@lobrien
Last active December 27, 2015 05:19
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lobrien/7273287 to your computer and use it in GitHub Desktop.
Save lobrien/7273287 to your computer and use it in GitHub Desktop.
let GetAsync(url : string, i : int) =
async {
let req = WebRequest.Create(url)
let! rsp = req.AsyncGetResponse()
use stream = (rsp :?> HttpWebResponse).GetResponseStream()
use zip = new GZipStream(stream, CompressionMode.Decompress)
use reader = new StreamReader(zip)
Console.WriteLine("Received page " + i.ToString())
return reader.ReadToEnd()
}
let FetchData(maxPage : int) : JsonValue[] =
[1..maxPage]
|> Seq.map( fun i -> GetAsync(UrlForPage(i), i))
|> Async.Parallel
|> Async.RunSynchronously
|> Seq.map (fun json -> JsonValue.Parse(json))
...etc...
@vasily-kirichenko
Copy link

We can do better :)

let getAsync (i: int) (url: string) = 
    async {
        let req = WebRequest.Create url
        let! rsp = req.AsyncGetResponse()
        use stream = (rsp :?> HttpWebResponse).GetResponseStream()
        use zip = new GZipStream(stream, CompressionMode.Decompress)
        use reader = new StreamReader(zip)
        printfn "Received page %d" i
        return reader.ReadToEnd()
    }

let fetchData (maxPage: int) : JsonValue[] =
    seq { 1 .. maxPage }
    |> Seq.map urlForPage
    |> Seq.mapi getAsync
    |> Async.Parallel
    |> Async.RunSynchronously
    |> Seq.map JsonValue.Parse

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