## Copyright (c) Eduardo Julian. All rights reserved. ## The use and distribution terms for this software are covered by the ## Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) ## which can be found in the file epl-v10.html at the root of this distribution. ## By using this software in any fashion, you are agreeing to be bound by ## the terms of this license. ## You must not remove this notice, or any other, from this software. (;import lux (lux/control (monoid #as m #refer #all) (functor #as F #refer #all) (monad #as M #refer #all))) ## [Types] (deftype #export (Writer l a) (, l a)) ## [Structures] (defstruct #export Writer/Functor (All [l] (Functor (Writer l))) (def (F;map f fa) (let [[log datum] fa] [log (f datum)]))) (defstruct #export (Writer/Monad mon) (All [l] (-> (Monoid l) (Monad (Writer l)))) (def M;_functor Writer/Functor) (def (M;wrap x) [(:: mon m;unit) x]) (def (M;join mma) (let [[log1 [log2 a]] mma] [(:: mon (m;++ log1 log2)) a])))