 : day-abbreviation2 ( n -- string )
     day-abbreviations2 nth ; inline
 
-CONSTANT: day-abbreviations3
+CONSTANT: day-abbreviations3-array
     { "Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat" }
 
-: day-abbreviation3 ( n -- string )
-    day-abbreviations3 nth ; inline
+CONSTANT: day-abbreviations3-hash
+    H{
+        { "Sun" 0 } { "Mon" 1 } { "Tue" 2 } { "Wed" 3 }
+        { "Thu" 4 } { "Fri" 5 } { "Sat" 6 }
+    }
 
 CONSTANT: average-month 30+5/12
 CONSTANT: months-per-year 12

: last-friday-of-month ( timestamp -- new-timestamp ) 5 last-day-this-month ;
: last-saturday-of-month ( timestamp -- new-timestamp ) 6 last-day-this-month ;

: beginning-of-week ( timestamp -- new-timestamp )
    midnight sunday ;


M: integer month-name check-month 1 - month-names nth ;
M: timestamp month-name month>> 1 - month-names nth ;

ERROR: not-a-month-abbreviation string ;

CONSTANT: month-abbreviations-array
    {
        "Jan" "Feb" "Mar" "Apr" "May" "Jun"
        "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
    }

CONSTANT: month-abbreviations-hash
    H{
        { "Jan" 1 } { "Feb" 2 } { "Mar" 3 }
        { "Apr" 4 } { "May" 5 } { "Jun" 6 }
        { "Jul" 7 } { "Aug" 8 } { "Sep" 9 }
        { "Oct" 10 } { "Nov" 11 } { "Dec" 12 }
    }

: n>month-abbreviation ( n -- string )
    check-month 1 - month-abbreviations-array nth ;

: month-abbreviation>n ( string -- n )
    month-abbreviations-hash ?at
    [ not-a-month-abbreviation ] unless ;

CONSTANT: day-counts { 0 31 28 31 30 31 30 31 31 30 31 30 31 }

