;; L'algorithme défini dans la documentation contient huit message ;; d'orientation possibles (def orientations {:less_15 "Cette application n’est pas faite pour les personnes de moins de 15 ans. Prenez contact avec votre médecin généraliste au moindre doute. En cas d’urgence, appelez le 15." :consultation_surveillance_1 "Votre situation peut relever d’un COVID 19. Demandez une téléconsultation ou un médecin généraliste ou une visite à domicile. Appelez le 15 si une gêne respiratoire ou des difficultés importantes pour vous alimenter ou boire apparaissent pendant plus de 24 heures. En attendant et pour casser les chaînes de transmission, nous vous conseillons de vous isoler et de respecter les gestes barrières pour protéger vos proches." :consultation_surveillance_2 "Votre situation peut relever d’un COVID 19. Demandez une téléconsultation ou un médecin généraliste ou une visite à domicile. Si vous n'arrivez pas à obtenir de consultation, appelez le 15. En attendant et pour casser les chaînes de transmission, nous vous conseillons de vous isoler et de respecter les gestes barrières pour protéger vos proches." :SAMU "Appelez le 15." :consultation_surveillance_3 "Votre situation peut relever d’un COVID 19. Demandez une téléconsultation ou un médecin généraliste ou une visite à domicile (SOS médecins, etc.) En attendant et pour casser les chaînes de transmission, nous vous conseillons de vous isoler et de respecter les gestes barrières pour protéger vos proches." :consultation_surveillance_4 "Votre situation peut relever d’un COVID 19. Un avis médical est recommandé. Au moindre doute, appelez le 15. Nous vous conseillons de rester à votre domicile. En attendant et pour casser les chaînes de transmission, nous vous conseillons de vous isoler et de respecter les gestes barrières pour protéger vos proches." :surveillance "Votre situation ne relève probablement pas du COVID 19. N’hésitez pas à contacter votre médecin en cas de doute. Vous pouvez refaire le test en cas de nouveau symptôme pour réévaluer la situation. Pour toute information concernant le COVID 19, composer le 0 800 130 000."})
;; Fonction de calcul de l'indice de masse corporelle (defn compute-bmi [weight height] (/ weight (Math/pow (/ height 100.0) 2))) ;; Fonction pour réduire l'âge à la tranche d'âge (defn get-age-range [reponse] (cond (< (:age reponse) 15) "inf_15" (< (:age reponse) 50) "from_15_to_49" (< (:age reponse) 70) "from_50_to_64" :else "sup_65")) ;; Fonction pour mettre le bmi, age-range dans la réponse, et ;; incrémenter les facteurs pronostiques ou de gravité (defn preprocess-scores [reponse] (let [bmi-val (compute-bmi (:weight reponse) (:height reponse)) age-range (get-age-range reponse) reponse (merge reponse {:bmi bmi-val}) reponse (merge reponse {:age-range age-range}) reponse (update-in reponse [:pronostic-factors] #(if (= (:age-range reponse) "sup_65") (inc %) %)) reponse (update-in reponse [:pronostic-factors] #(if (>= bmi-val 30) (inc %) %)) reponse (dissoc reponse :weight :height :age)] ;; Renvoie la réponse remise en forme: reponse))
;; Fonction pour calculer l'orientation en fonction de la réponse (defn orientation [reponse] ;; Initialisation des valeurs d'entrées (let [reponse (preprocess-scores reponse) {:keys [bmi age-range agueusia_anosmia fever diarrhea cough sore_throat_aches minor-severity-factors major-severity-factors pronostic-factors]} reponse {:keys [less_15 consultation_surveillance_1 consultation_surveillance_2 SAMU consultation_surveillance_3 consultation_surveillance_4 surveillance]} orientations] ;; L'algorithme COVID19 proprement dit (cond ;; Branche 1 (= age-range "inf_15") (do (println "Branch 1: less than 15 years") less_15) ;; Branche 2 (>= major-severity-factors 1) (do (println "Branch 2: at least one major gravity factor") SAMU) ;; Branche 3 (and fever cough) (do (println "Branch 3: fever and cough") (cond (= pronostic-factors 0) consultation_surveillance_3 (>= pronostic-factors 1) (if (< minor-severity-factors 2) consultation_surveillance_4 consultation_surveillance_2))) ;; Branche 4 (or fever diarrhea (and cough sore_throat_aches) (and cough agueusia_anosmia) (and sore_throat_aches agueusia_anosmia)) (do (println "Branch 4: fever and other symptoms") (cond (= pronostic-factors 0) (if (= minor-severity-factors 0) (if (= age-range "from_15_to_49") consultation_surveillance_3 consultation_surveillance_1) consultation_surveillance_1) (>= pronostic-factors 1) (if (< minor-severity-factors 2) consultation_surveillance_1 consultation_surveillance_2))) ;; Branche 5 (or (and cough (not sore_throat_aches) (not agueusia_anosmia)) (and (not cough) sore_throat_aches (not agueusia_anosmia)) (and (not cough) (not sore_throat_aches) agueusia_anosmia)) (do (println "Branch 5: no fever and one other symptom") (if (= pronostic-factors 0) consultation_surveillance_3 consultation_surveillance_4)) ;; Branche 6 (and (not cough) (not sore_throat_aches) (not agueusia_anosmia)) (do (println "Branche 6: no symptom") surveillance))))
;; Vous pouvez modifier les valeurs ci-dessous. (def exemple-de-reponse {:fever true ; Dépend de la température :diarrhea false ; Idem :cough true ; Idem :sore_throat_aches false ; Idem :agueusia_anosmia false ; Idem :age 62 ; Valeur normale :weight 63 ; En kgs :height 167 ; En centimètres :pronostic-factors 0 ; Voir première série de questions :minor-severity-factors 0 ; Fièvre >= 39°C ou alitement >= 50% temps diurne :major-severity-factors 0 ; Gêne respiratoire ou difficulté manger/boire })
Changez l'exemple de réponse ci-dessus et voyez le résultat.
(orientation exemple-de-reponse)