! Copyright (C) 2008 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: io.files io.encodings.ascii sequences sequences.lib
-math.parser combinators kernel memoize csv symbols inspector
-words accessors math.order sorting ;
+! See https://factorcode.org/license.txt for BSD license.
+USING: accessors binary-search combinators combinators.smart csv
+io.encodings.ascii kernel math.order math.parser sequences
+summary ;
IN: usa-cities
SINGLETONS: AK AL AR AS AZ CA CO CT DC DE FL GA HI IA ID IL IN
M: no-such-state summary drop "No such state" ;
MEMO: string>state ( string -- state )
- dup states [ word-name = ] with find nip
- [ ] [ no-such-state ] ?if ;
+ [ states [ name>> = ] with find nip ]
+ [ no-such-state ] ?unless ;
TUPLE: city
first-zip name state latitude longitude gmt-offset dst-offset ;
MEMO: cities ( -- seq )
- "resource:extra/usa-cities/zipcode.csv" ascii <file-reader>
- csv rest-slice [
- 7 firstn {
- [ string>number ]
- [ ]
- [ string>state ]
- [ string>number ]
- [ string>number ]
- [ string>number ]
- [ string>number ]
- } spread city boa
+ "vocab:usa-cities/zipcode.csv" ascii file>csv
+ rest-slice [
+ [
+ {
+ [ string>number ]
+ [ ]
+ [ string>state ]
+ [ string>number ]
+ [ string>number ]
+ [ string>number ]
+ [ string>number ]
+ } spread
+ ] input<sequence city boa
] map ;
MEMO: cities-named ( name -- cities )
MEMO: cities-named-in ( name state -- cities )
cities [
- tuck [ name>> = ] [ state>> = ] 2bi* and
- ] with with filter ;
+ [ name>> = ] [ state>> = ] bi-curry bi* and
+ ] 2with filter ;
: find-zip-code ( code -- city )
- cities [ first-zip>> <=> ] binsearch* ;
+ cities [ first-zip>> <=> ] with search nip ;