Calculate how many hours you're working. A project in multiple languages.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

81 lines
1.5 KiB

(ns working-hours.hours)
(defn not-nil? [x]
"Just check if the value is not nil."
(not (= x nil))
)
(defn right-size? [x]
"Check if the hour has the correct size."
(= (count x) 5)
)
(defn extract-hours [x]
"Extract the hours in the hour string."
(Integer. (.substring x 0 2))
)
(defn extract-minutes [x]
"Extract the minutes in the hour string."
(Integer. (.substring x 3 5))
)
(defn valid-hours? [x]
"Check if the hours are valid."
(let [hours (extract-hours x)]
(and (>= hours 0)
(<= hours 23)
)
)
)
(defn valid-minutes? [x]
"Check if the minutes are valid."
(let [minutes (extract-minutes x)]
(and (>= minutes 0)
(<= minutes 59)
)
)
)
(defn build-hour-struct [x]
"Return the internal representation for the hour."
(let [hours (extract-hours x)
minutes (extract-minutes x)]
(+ (* hours 60) minutes)
)
)
(defn new [x]
"Create a new hour representation from the string."
(if (and (and (and (not-nil? x)
(right-size? x)
(valid-hours? x)
(valid-minutes? x)
)))
(build-hour-struct x)
nil
)
)
(defn sub [x y]
"Substract one hour from another."
(- y x)
)
(defn add [x y]
"Add one hour to another."
(+ x y)
)
(defn preceeds? [x y]
(< x y)
)
(defn to-string [x]
"Convert the hour structure to a string."
(let [hour (int (Math/floor (/ x 60)))
minute (- x (* hour 60))]
(format "%02d:%02d" hour minute)
)
)