]> gitweb.factorcode.org Git - factor.git/commitdiff
redo holidays
authorDoug Coleman <doug.coleman@gmail.com>
Thu, 12 Nov 2009 20:43:11 +0000 (14:43 -0600)
committerDoug Coleman <doug.coleman@gmail.com>
Thu, 12 Nov 2009 20:43:11 +0000 (14:43 -0600)
extra/calendar/holidays/us/us.factor

index 7b3a7ea5701ab18cc1ebfa85440ea0ee557f51a6..60018dfb6a48d59f7c57525652ee16d34623b944 100644 (file)
 ! Copyright (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors calendar kernel math words ;
+USING: accessors assocs calendar combinators.short-circuit fry
+kernel lexer math namespaces parser sequences shuffle vocabs
+words ;
 IN: calendar.holidays.us
 
+SYMBOLS: world us us-federal canada
+commonwealth-of-nations ;
+
 <<
-SYNTAX: us-federal
-    word "us-federal" dup set-word-prop ;
+SYNTAX: HOLIDAY:
+    CREATE-WORD
+    dup H{ } clone "holiday" set-word-prop
+    parse-definition (( timestamp/n -- timestamp )) define-declared ;
+
+SYNTAX: HOLIDAY-NAME:
+    scan-word "holiday" word-prop scan-word scan-object >at drop ;
 >>
 
-! Federal Holidays
-: new-years-day ( timestamp/n -- timestamp )
-    january 1 >>day ; us-federal
+: holiday>timestamp ( n word -- timestamp )
+    execute( timestamp -- timestamp' ) ;
+
+: find-holidays ( n symbol -- seq )
+    all-words swap '[ "holiday" word-prop _ swap key? ] filter
+    [ holiday>timestamp ] with map ;
+
+: adjust-federal-holiday ( timestamp -- timestamp' )
+    dup saturday? [
+        1 days time-
+    ] [
+        dup sunday? [
+            1 days time+
+        ] when 
+    ] if ;
 
-: martin-luther-king-day ( timestamp/n -- timestamp )
-    january 3 monday-of-month ; us-federal
+: us-federal-holidays ( timestamp/n -- seq )
+    us-federal find-holidays [ adjust-federal-holiday ] map ;
 
-: inauguration-day ( timestamp/n -- timestamp )
-    year dup neg 4 rem + january 20 >>day ; us-federal
+: canadian-holidays ( timestamp/n -- seq )
+    canada find-holidays ;
 
-: washington's-birthday ( timestamp/n -- timestamp )
-    february 3 monday-of-month ; us-federal
+HOLIDAY: new-year's-day january 1 >>day ;
+HOLIDAY-NAME: new-year's-day world "New Year's Day"
+HOLIDAY-NAME: new-year's-day us-federal "New Year's Day"
 
-ALIAS: presidents-day washington's-birthday us-federal
+HOLIDAY: martin-luther-king-day january 3 monday-of-month ;
+HOLIDAY-NAME: martin-luther-king-day us-federal "Martin Luther King Day"
 
-: memorial-day ( timestamp/n -- timestamp )
-    may last-monday-of-month ; us-federal
+HOLIDAY: inauguration-day year dup 4 neg rem + january 20 >>day ;
+HOLIDAY-NAME: inauguration-day us "Inauguration Day"
 
-: independence-day ( timestamp/n -- timestamp )
-    july 4 >>day ; us-federal
+HOLIDAY: washington's-birthday february 3 monday-of-month ;
+HOLIDAY-NAME: washington's-birthday us-federal "Washington's Birthday"
 
-: labor-day ( timestamp/n -- timestamp )
-    september 1 monday-of-month ; us-federal
+HOLIDAY: memorial-day may last-monday-of-month ;
+HOLIDAY-NAME: memorial-day us-federal "Memorial Day"
 
-: columbus-day ( timestamp/n -- timestamp )
-    october 2 monday-of-month ; us-federal
+HOLIDAY: independence-day july 4 >>day ;
+HOLIDAY-NAME: independence-day us-federal "Independence Day"
 
-: veterans'-day ( timestamp/n -- timestamp )
-    november 11 >>day ; us-federal
+HOLIDAY: labor-day september 1 monday-of-month ;
+HOLIDAY-NAME: labor-day us-federal "Labor Day"
 
-: thanksgiving-day ( timestamp/n -- timestamp )
-    november 4 thursday-of-month ; us-federal
+HOLIDAY: columbus-day october 2 monday-of-month ;
+HOLIDAY-NAME: columbus-day us-federal "Columbus Day"
 
-: christmas-day ( timestamp/n -- timestamp )
-    december 25 >>day ; us-federal
+HOLIDAY: veterans-day november 11 >>day ;
+HOLIDAY-NAME: veterans-day us-federal "Veterans Day"
+HOLIDAY-NAME: veterans-day world "Armistice Day"
+HOLIDAY-NAME: veterans-day commonwealth-of-nations "Remembrance Day"
 
-! Other Holidays
+HOLIDAY: thanksgiving-day november 4 thursday-of-month ;
+HOLIDAY-NAME: thanksgiving-day us-federal "Thanksgiving Day"
 
-: belly-laugh-day ( timestamp/n -- timestamp )
-    january 24 >>day ;
+HOLIDAY: canadian-thanksgiving-day october 2 monday-of-month ;
+HOLIDAY-NAME: canadian-thanksgiving-day canada "Thanksgiving Day"
 
-: groundhog-day ( timestamp/n -- timestamp )
-    february 2 >>day ;
+HOLIDAY: christmas-day december 25 >>day ;
+HOLIDAY-NAME: christmas-day world "Christmas Day"
+HOLIDAY-NAME: christmas-day us-federal "Christmas Day"
 
-: lincoln's-birthday ( timestamp/n -- timestamp )
-    february 12 >>day ;
+HOLIDAY: belly-laugh-day january 24 >>day ;
 
-: valentine's-day ( timestamp/n -- timestamp )
-    february 14 >>day ;
+HOLIDAY: groundhog-day february 2 >>day ;
 
-: st-patrick's-day ( timestamp/n -- timestamp )
-    march 17 >>day ;
+HOLIDAY: lincoln's-birthday february 12 >>day ;
 
-: ash-wednesday ( timestamp/n -- timestamp )
-    easter 46 days time- ;
+HOLIDAY: valentine's-day february 14 >>day ;
+
+HOLIDAY: st-patrick's-day march 17 >>day ;
+
+HOLIDAY: ash-wednesday easter 46 days time- ;
 
 ALIAS: first-day-of-lent ash-wednesday
 
-: fat-tuesday ( timestamp/n -- timestamp )
-    ash-wednesday 1 days time- ;
+HOLIDAY: fat-tuesday ash-wednesday 1 days time- ;
+
+HOLIDAY: good-friday easter 2 days time- ;
 
-: good-friday ( timestamp/n -- timestamp )
-    easter 2 days time- ;
+HOLIDAY: tax-day april 15 >>day ;
 
-: tax-day ( timestamp/n -- timestamp )
-    april 15 >>day ;
+HOLIDAY: earth-day april 22 >>day ;
 
-: earth-day ( timestamp/n -- timestamp )
-    april 22 >>day ;
+HOLIDAY: administrative-professionals'-day april last-saturday-of-month wednesday ;
 
-: administrative-professionals'-day ( timestamp/n -- timestamp )
-    april last-saturday-of-month wednesday ;
+HOLIDAY: cinco-de-mayo may 5 >>day ;
 
-: cinco-de-mayo ( timestamp/n -- timestamp )
-    may 5 >>day ;
+HOLIDAY: mother's-day may 2 sunday-of-month ;
 
-: mother's-day ( timestamp/n -- timestamp )
-    may 2 sunday-of-month ;
+HOLIDAY: armed-forces-day may 3 saturday-of-month ;
 
-: armed-forces-day ( timestamp/n -- timestamp )
-    may 3 saturday-of-month ;
+HOLIDAY: flag-day june 14 >>day ;
 
-: flag-day ( timestamp/n -- timestamp )
-    june 14 >>day ;
+HOLIDAY: parents'-day july 4 sunday-of-month ;
 
-: parents'-day ( timestamp/n -- timestamp )
-    july 4 sunday-of-month ;
+HOLIDAY: grandparents'-day labor-day 1 weeks time+ ;
 
-: grandparents'-day ( timestamp/n -- timestamp )
-    labor-day 1 weeks time+ ;
+HOLIDAY: patriot-day september 11 >>day ;
 
-: patriot-day ( timestamp/n -- timestamp )
-    september 11 >>day ;
+HOLIDAY: stepfamily-day september 16 >>day ;
 
-: stepfamily-day ( timestamp/n -- timestamp )
-    september 16 >>day ;
+HOLIDAY: citizenship-day september 17 >>day ;
 
-: citizenship-day ( timestamp/n -- timestamp )
-    september 17 >>day ;
+HOLIDAY: boss's-day october 16 >>day ;
 
-: boss's-day ( timestamp/n -- timestamp )
-    october 16 >>day ;
+HOLIDAY: sweetest-day october 3 saturday-of-month ;
 
-: sweetest-day ( timestamp/n -- timestamp )
-    october 3 saturday-of-month ;
+HOLIDAY: halloween october 31 >>day ;
 
-: halloween ( timestamp/n -- timestamp )
-    october 31 >>day ;
+HOLIDAY: election-day november 1 monday-of-month 1 days time+ ;
 
-: election-day ( timestamp/n -- timestamp )
-    november 1 monday-of-month 1 days time+ ;
+HOLIDAY: black-friday thanksgiving-day 1 days time+ ;
 
-: black-friday ( timestamp/n -- timestamp )
-    thanksgiving-day 1 days time+ ;
+HOLIDAY: pearl-harbor-remembrance-day december 7 >>day ;
 
-: pearl-harbor-remembrance-day ( timestamp/n -- timestamp )
-    december 7 >>day ;
+HOLIDAY: new-year's-eve december 31 >>day ;
 
-: new-year's-eve ( timestamp/n -- timestamp )
-    december 31 >>day ;
+: post-office-open? ( timestamp -- ? )
+    {
+        [ sunday? not ]
+        [ dup us-federal-holidays [ same-day? ] with any? not ]
+    } 1&& ;