diff --git a/extra/hacker-news/hacker-news.factor b/extra/hacker-news/hacker-news.factor index 7baa71d490..66f33f109e 100644 --- a/extra/hacker-news/hacker-news.factor +++ b/extra/hacker-news/hacker-news.factor @@ -9,20 +9,34 @@ kernel make math math.parser sequences ui urls vocabs ; IN: hacker-news ; : 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 -- ) '[ @@ -69,8 +83,7 @@ PRIVATE> ] } cleave ; -: banner. ( -- ) - "Hacker News" +: banner. ( str -- ) "http://news.ycombinator.com" >url presented associate H{ { font-size 20 } @@ -79,7 +92,39 @@ PRIVATE> { 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. ;