sequences splitting ui urls ;
IN: hacker-news
-TUPLE: post title postedBy points id url commentCount postedAgo ;
-
<PRIVATE
: json-null>f ( obj -- obj/f )
dup json-null = [ drop f ] when ;
-: items> ( seq -- seq' )
+: hacker-news-items ( n -- seq )
[
- \ post from-slots
- [ json-null>f ] change-postedAgo
- [ json-null>f ] change-postedBy
- dup url>> "/comments" head? [
- dup url>> "/" split last string>number >>id
- "self" >>url
- ] when
- ] map ;
-
-: hacker-news-items ( -- seq )
- "http://api.ihackernews.com/page" http-get nip
- json> "items" of items> ;
+ "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 ;
: write-title ( title url -- )
'[
H{ { foreground HEXCOLOR: 888888 } } format ;
: post>user-url ( post -- user-url )
- postedBy>> "http://news.ycombinator.com/user?id=" prepend >url ;
+ "by" of "http://news.ycombinator.com/user?id=" prepend >url ;
: post>comments-url ( post -- user-url )
- id>> "http://news.ycombinator.com/item?id=%d" sprintf >url ;
+ "id" of "http://news.ycombinator.com/item?id=%d" sprintf >url ;
! Api is funky, gives id=0 and /comment/2342342 for self-post ads
: post>url ( post -- url )
- dup url>> "self" = [
- post>comments-url
- ] [
- url>> >url
- ] if ;
+ dup "url" of "self" = [ post>comments-url ] [ "url" of >url ] if ;
PRIVATE>
: post. ( post index -- )
"%2d. " sprintf write-text {
- [ [ title>> ] [ post>url ] bi write-title ]
+ [ [ "title" of ] [ "url" of ] bi write-title ]
[ post>url host>> " (" ")" surround write-text nl ]
- [ points>> " %d points" sprintf write-text ]
- [ dup postedBy>> [ " by " write-text [ postedBy>> ] [ post>user-url ] bi write-link ] [ drop ] if ]
- [ dup postedAgo>> [ " " write-text postedAgo>> write-text ] [ drop ] if ]
+ [ "score" of " %d points" sprintf write-text ]
+ [ 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
- [ commentCount>> [ "discuss" ] [ "%d comments" sprintf ] if-zero ]
+ [ "descendants" of [ "discuss" ] [ "%d comments" sprintf ] if-zero ]
[ post>comments-url ] bi write-link nl nl
]
} cleave ;
} assoc-union format nl ;
: hacker-news. ( -- )
- hacker-news-items banner.
+ 25 hacker-news-items
+ banner.
[ 1 + post. ] each-index ;