]> gitweb.factorcode.org Git - factor.git/blobdiff - extra/zoneinfo/zoneinfo.factor
assocs.extras: fix usages of collect-key-by collect-value-by
[factor.git] / extra / zoneinfo / zoneinfo.factor
index 9f4f22ad0f201c4a298334b171cd34819133b4b8..58782b4ed31a0cdec6e289695ad224c73d713792 100644 (file)
@@ -19,12 +19,12 @@ CONSTANT: zoneinfo-paths
     "vocab:zoneinfo/pacificnew"
     "vocab:zoneinfo/southamerica"
     "vocab:zoneinfo/backzone"
+    "vocab:zoneinfo/etcetera"
 }
 
 CONSTANT: zoneinfo-extra-paths
 {
     "vocab:zoneinfo/backward"
-    "vocab:zoneinfo/etcetera"
     "vocab:zoneinfo/factory"
     "vocab:zoneinfo/leapseconds"
     "vocab:zoneinfo/systemv"
@@ -32,7 +32,8 @@ CONSTANT: zoneinfo-extra-paths
 
 : zoneinfo-lines ( path -- seq )
     utf8 file-lines
-    [ { [ length 0 = ] [ "#" head? ] } 1|| ] reject ;
+    [ { [ length 0 = ] [ "#" head? ] } 1|| ] reject
+    [ "#" split1-last drop ] map ;
 
 TUPLE: zonetab codes lat lng tz comments ;
 C: <zonetab> zonetab
@@ -54,10 +55,10 @@ MEMO: zoneinfo-country-zones ( -- seq )
 : lookup-country-names ( seq -- seq' ) [ lookup-country-name ] map ;
 
 : timezone>country-map ( -- alist )
-    parse-zonetabs [ second ] collect-key-by ;
+    parse-zonetabs [ nip ] collect-key-by ;
 
 : country>timezones-map ( -- alist )
-    parse-zonetabs [ first ] collect-value-by ;
+    parse-zonetabs [ drop ] collect-value-by ;
 
 : country-timezones-map ( -- alist )
     country>timezones-map [ dup lookup-country-names zip ] map-values ;
@@ -146,7 +147,7 @@ MEMO: zoneinfo-assoc ( -- assoc )
 
 : zoneinfo-zones ( -- seq )
     raw-zone-map keys
-    [ "/" swap subseq? ] partition
+    [ "/" subseq-index? ] partition
     [ natural-sort ] bi@ append ;
 
 GENERIC: zone-matches? ( string rule -- ? )
@@ -231,8 +232,8 @@ ERROR: unknown-day-abbrev day ;
 
 : comparison-day-string ( timestamp string -- timestamp )
     {
-        { [ ">=" over subseq? ] [ ">=" split1 swap [ string>number >>day ] dip day-abbrev>= ] }
-        { [ "<=" over subseq? ] [ "<=" split1 swap [ string>number >>day ] dip day-abbrev<= ] }
+        { [ dup ">=" subseq-index? ] [ ">=" split1 swap [ string>number >>day ] dip day-abbrev>= ] }
+        { [ dup "<=" subseq-index? ] [ "<=" split1 swap [ string>number >>day ] dip day-abbrev<= ] }
         [ string>number >>day ]
     } cond ;
         
@@ -285,6 +286,11 @@ ERROR: unknown-last-day string ;
     ":" split1 "0" or [ string>number ] bi@
     [ instant ] 2dip 0 set-time ;
 
+: hms>duration ( str -- duration )
+    ":" split 3 "0" pad-tail
+    [ string>number ] map first3
+    [ instant ] 3dip set-time ;
+
 : rule>timestamp-rest ( timestamp zone -- from )
     {
         [ over fp-infinity? [ drop ] [ in>> month-abbreviation-index >>month ] if ]
@@ -325,7 +331,7 @@ ERROR: unknown-last-day string ;
     raw-rule-map at [
         [
             [ rule>timestamps [ dup fp-infinity? [ timestamp>unix-time ] unless ] bi@ 2array ]
-            [ [ save>> hm>duration ] [ letters>> ] bi 2array ] bi 2array
+            [ [ save>> hms>duration ] [ letters>> ] bi 2array ] bi 2array
         ] map
     ] keep zip ;