Skip to content

Instantly share code, notes, and snippets.

@t2ru
Created July 5, 2014 11:10
Show Gist options
  • Save t2ru/221b881bc053a55849da to your computer and use it in GitHub Desktop.
Save t2ru/221b881bc053a55849da to your computer and use it in GitHub Desktop.
clojure.algo.monads用のerror monadとそのテスト
(ns testmonad.amonad-test
(:use [clojure.test]
[clojure.algo.monads]))
(defprotocol Either
(either-call [obj on-left on-right]))
(defrecord Left [v]
Either (either-call [obj on-left on-right] (on-left v)))
(defrecord Right [v]
Either (either-call [obj on-left on-right] (on-right v)))
(defmacro either [obj left-sym left-expr right-sym right-expr]
`(either-call ~obj (fn [~left-sym] ~left-expr) (fn [~right-sym] ~right-expr)))
(defmonad error-m
[m-result (fn m-result-error [v]
(->Right v))
m-bind (fn m-bind-error [mv f]
(either mv
e (->Left e)
v (f v)))])
(defn ok [v] (->Right v))
(defn ng [e] (->Left e))
(defmethod clojure.core/print-method Left [v ^java.io.Writer w]
(.write w (str "#ng " (pr-str (:v v)))))
(defmethod clojure.core/print-method Right [v ^java.io.Writer w]
(.write w (str "#ok " (pr-str (:v v)))))
(deftest hoge
(testing ""
(let [s (domonad state-m
[_ (set-state {:x 1})]
nil)]
(is (= [nil {:x 1}]
(s {})))))
(testing ""
(let [s (domonad (state-t maybe-m)
[_ (set-state {:x 1})]
nil)]
(is (= [nil {:x 1}]
(s {})))))
(testing ""
(is (= (ng :hoge) (domonad error-m [_ (ng :hoge)] :piyo))))
(is (= (ok :piyo) (domonad error-m [_ (ok :hoge)] :piyo)))
(testing ""
(let [set-statex (fn [s] (fn [_] (ok [nil s])))
fail (fn [msg] (fn [_] (ng msg)))
s (domonad (state-t error-m)
[_ (set-statex {:x 1})]
:hoge)]
(is (= (ok [:hoge {:x 1}])
(s {})))))
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment