IN: hacker-news
<PRIVATE
-
-: hacker-news-recent-ids ( -- seq )
- "https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty"
+: hacker-news-ids ( endpoint -- ids )
+ "https://hacker-news.firebaseio.com/v0/%s.json?print=pretty" sprintf
http-get nip json> ;
: hacker-news-id>json-url ( n -- url )
- number>string
- "https://hacker-news.firebaseio.com/v0/item/" ".json?print=pretty" surround ;
+ "https://hacker-news.firebaseio.com/v0/item/%d.json?print=pretty" sprintf ;
-: hacker-news-items ( seq -- seq' )
+: hacker-news-items ( n endpoint -- seq' )
+ hacker-news-ids swap short head
[ 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 ;
+: hacker-news-top-stories ( n -- seq )
+ "topstories" hacker-news-items ;
+
+: hacker-news-new-stories ( n -- seq )
+ "newstories" hacker-news-items ;
+
+: hacker-news-best-stories ( n -- seq )
+ "beststories" hacker-news-items ;
+
+: hacker-news-ask-stories ( n -- seq )
+ "askstories" hacker-news-items ;
+
+: hacker-news-show-stories ( n -- seq )
+ "showstories" hacker-news-items ;
+
+: hacker-news-job-stories ( n -- seq )
+ "jobstories" hacker-news-items ;
: write-title ( title url -- )
'[
]
} cleave ;
-: banner. ( -- )
- "Hacker News"
+: banner. ( str -- )
"http://news.ycombinator.com" >url presented associate
H{
{ font-size 20 }
{ foreground COLOR: black }
} assoc-union format nl ;
-: hacker-news. ( -- )
- 30 hacker-news-recent-items
- banner.
+: hacker-news-feed. ( seq -- )
[ 1 + post. ] each-index ;
+
+: hacker-news. ( str seq -- )
+ [ banner. ]
+ [ hacker-news-feed. ] bi* ;
+
+: hacker-news-top. ( -- )
+ "Hacker News - Top"
+ 30 hacker-news-top-stories
+ hacker-news. ;
+
+: hacker-news-new. ( -- )
+ "Hacker News - New"
+ 50 hacker-news-new-stories
+ hacker-news. ;
+
+: hacker-news-best. ( -- )
+ "Hacker News - Best"
+ 50 hacker-news-best-stories
+ hacker-news. ;
+
+: hacker-news-ask. ( -- )
+ "Hacker News - Ask"
+ 50 hacker-news-ask-stories
+ hacker-news. ;
+
+: hacker-news-show. ( -- )
+ "Hacker News - Show"
+ 50 hacker-news-show-stories
+ hacker-news. ;
+
+: hacker-news-job. ( -- )
+ "Hacker News - Job"
+ 50 hacker-news-job-stories
+ hacker-news. ;