Skip to content

Instantly share code, notes, and snippets.

@gws
Last active August 29, 2015 14:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gws/3d091805d6ba1b359c5d to your computer and use it in GitHub Desktop.
Save gws/3d091805d6ba1b359c5d to your computer and use it in GitHub Desktop.
Using the Maybe monad in hypothetical Ring middleware
(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