 ! Copyright (C) 2012 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors assocs classes.tuple colors.constants
-colors.hex combinators formatting fry hashtables http.client io
-io.styles json json.reader kernel make math math.parser
-sequences splitting ui urls ;
+colors.hex combinators concurrency.combinators formatting fry
+hashtables http.client io io.styles json json.reader kernel make
+math math.parser sequences splitting ui urls ;
 IN: hacker-news
 
 <PRIVATE
 
-: json-null>f ( obj -- obj/f )
-    dup json-null = [ drop f ] when ;
+: hacker-news-recent-ids ( -- seq )
+    "https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty"
+    http-get nip json> ;
 
-: hacker-news-items ( n -- seq )
-    [
-        "https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty"
-        http-get nip json>
-    ] dip head
-    [
-        number>string
-        "https://hacker-news.firebaseio.com/v0/item/" ".json?print=pretty" surround
-        http-get nip json>
-    ] parallel-map ;
+: hacker-news-id>json-url ( n -- url )
+    number>string
+    "https://hacker-news.firebaseio.com/v0/item/" ".json?print=pretty" surround ;
+
+: hacker-news-items ( seq -- seq' )
+    [ hacker-news-id>json-url http-get nip json> ] parallel-map ;
+
+: hacker-news-recent-items ( n -- seq )
+    [  hacker-news-recent-ids ] dip head hacker-news-items ;
 
 : write-title ( title url -- )
     '[

        [ dup "by" of [ " by " write-text [ "by" of ] [ post>user-url ] bi write-link ] [ drop ] if ]
        ! [ dup postedAgo>> [ " " write-text postedAgo>> write-text ] [ drop ] if ]
        [
            " | " write-text
            [ "descendants" of [ "discuss" ] [ "%d comments" sprintf ] if-zero ]
            [ post>comments-url ] bi write-link nl nl
        ]
    } cleave ;


    } assoc-union format nl ;

: hacker-news. ( -- )
    30 hacker-news-recent-items
    banner.
    [ 1 + post. ] each-index ;
