Commits

Meikel Brandmeyer committed 1d036d3

Added the Maybe monad

* maybe.clj: new file

Comments (0)

Files changed (2)

 			<sysproperty key="clojure.compile.path"
 				value="${build}"/>
 			<arg value="de.kotka.monad"/>
+			<arg value="de.kotka.monad.maybe"/>
 		</java>
 	</target>
 

src/de/kotka/monad/maybe.clj

+;-
+; Copyright 2008 (c) Meikel Brandmeyer.
+; All rights reserved.
+;
+; Permission is hereby granted, free of charge, to any person obtaining a copy
+; of this software and associated documentation files (the "Software"), to deal
+; in the Software without restriction, including without limitation the rights
+; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+; copies of the Software, and to permit persons to whom the Software is
+; furnished to do so, subject to the following conditions:
+;
+; The above copyright notice and this permission notice shall be included in
+; all copies or substantial portions of the Software.
+;
+; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+; THE SOFTWARE.
+
+(clojure.core/ns de.kotka.monad.maybe
+  (:use
+     de.kotka.monad
+     [clojure.contrib.def :only (defvar)]))
+
+(def
+  #^{:doc
+  "nothing represents the empty value of the maybe monad."}
+  nothing
+  (return ::type `nothing))
+
+(defn just
+  "just returns a monad representing the passed-in something."
+  [something]
+  (return ::type [something]))
+
+(defn is-nothing?
+  "Predicate for testing, whether a given monad represents nothing."
+  [m]
+  (= `nothing m))
+
+(def
+  #^{:doc
+  "Predicate for testing, whether a given monad represents some value."}
+  is-just?
+  vector?)
+
+(defn from-maybe?
+  "Retrieve the value from a maybe monad. Returns the default in case the monad
+  represents nothing. Or throws an exception in case no default was given."
+  ([m]
+   (if (is-just? m)
+     (first m)
+     (throw (Exception. "Tried to retrieve a value from nothing"))))
+  ([m default]
+   (if (is-just? m) (first m) default)))
+
+(defmethod bind ::type
+  [m f]
+  (if (= `nothing m) m (f (first m))))