Happy New to all of you!!!
Recently I came across the barber problem (again) and while reading it I
thought that code.async would be ideal for this kind of problem. Below is
the code I have come up with. I think it does the trick but I am not
entirely happy with it, for instance the fact that I use the two atoms as
counters. I also wonder if there is a better way to time the ten seconds,
something instead of the atom.
So please critique the code below, any comments, improvements, obfuscations
etc. are welcome!!
Thomas
(ns barber.core
(:require [clojure.core.async :as async]))
;; A barber shop takes customers
;; Customer arrive at random intervals, from ten to thirty milliseconds
;; The barber shop has three chairs in the waiting room
;; The barber shop has one barber and one barber chair
;; When the barber's chair is empty, a customer sits in the the chair
;; wakes up the barber, and gets a haircut.
;; If the chairs are occupied , all new customer will turn away
;; Haircuts takes twenty milliseconds
;; After a customer receives a haircut, he gets up and leaves.
;;
;; Write a program that determines how many haircuts a barber can
;; give in ten seconds.
(def running (atom false))
(def counter1 (atom 0))
(def counter2 (atom 0))
(defn customers []
(let [c (async/chan (async/dropping-buffer 3))]
(async/go
(while @running
(async/<! (async/timeout (+ 10 (rand-int 21))))
(async/>! c (swap! counter1 inc))))
c))
(defn barber [c]
(async/go
(while true
(let [r (async/<! c)]
(async/<! (async/timeout 20))
;(println r)
(swap! counter2 inc)))))
(comment
(reset! counter1 0)
(reset! counter2 0)
(reset! running true)
(barber (customers))
(Thread/sleep (* 10 1000))
;(async/timeout (* 10 1000)) ;; not sure why this doesn't work here,
would make it portable to clojureScript I think
(reset! running false)
(println (str "Served " @counter2 " customers out of " @counter1 "
possible customers"))
)
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.