(ns example.factory.aws.cloudformation) (defn apply-stack-fn [create-fn update-fn] (fn apply-stack [payload] (try (create-fn payload) (catch AlreadyExistsException e (update-fn payload))))) (defn expand-params [params-hash] ; something pure ) (defn deploy-stack-fn [apply-fn] (fn deploy-stack [stack-name template-hash params-hash] (apply-fn :stack-name stack-name :template-body (json/write-str template-hash) :parameters (expand-params params-hash)))) (ns example.aws.cloudformation (:require [example.factory.aws.cloudformation :as factory])) (def apply-stack (factory/apply-stack-fn cloudformation/create-stack cloudformation/update-stack)) (def deploy-stack (factory/deploy-stack-fn apply-stack))