Last active
August 29, 2015 14:03
-
-
Save gws/3d091805d6ba1b359c5d to your computer and use it in GitHub Desktop.
Using the Maybe monad in hypothetical Ring middleware
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns maybe-monad | |
(:require [clojure.algo.monads :refer [domonad maybe-m]] | |
[myapp.magic :as magic])) | |
;; Non-monadic version | |
(defn wrap-user | |
"Add user information to the request map if logged in." | |
[handler] | |
(fn [request] | |
(let [db (get-in request [:myapp :system :db]) | |
ident (get-in request [:session ::friend/identity :current])] | |
(if ident | |
(let [user (magic/user-by-id db ident)] | |
(if user | |
(handler (assoc-in request [:myapp :user] user)) | |
(handler request))) | |
(handler request))))) | |
;; Monadic version | |
(defn wrap-user | |
"Add user information to the request map if logged in." | |
[handler] | |
(fn [request] | |
(let [db (get-in request [:myapp :system :db]) | |
user (domonad maybe-m [ident (get-in request [:session ::friend/identity :current]) | |
u (magic/user-by-id db ident)] | |
u)] | |
(if user | |
(handler (assoc-in request [:myapp :user] user)) | |
(handler request))))) | |
;; Shorter monadic version | |
(defn wrap-user | |
"Add user information to the request map if logged in." | |
[handler] | |
(fn [request] | |
(let [db (get-in request [:myapp :system :db]) | |
user (domonad maybe-m [ident (get-in request [:session ::friend/identity :current])] | |
(magic/user-by-id db ident))] | |
(if user | |
(handler (assoc-in request [:myapp :user] user)) | |
(handler request))))) | |
;; The main benefit is that (handler request) does not need to be duplicated for each | |
;; new piece of logic we may want to add. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment