%% The contents of this file are subject to the Mozilla Public License %% Version 1.1 (the "License"); you may not use this file except in %% compliance with the License. You may obtain a copy of the License %% at http://www.mozilla.org/MPL/ %% %% Software distributed under the License is distributed on an "AS IS" %% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %% the License for the specific language governing rights and %% limitations under the License. %% %% The Original Code is Erlando. %% %% The Initial Developer of the Original Code is VMware, Inc. %% Copyright (c) 2011-2013 VMware, Inc. All rights reserved. %% -module(error_m). -behaviour(monad). -export(['>>='/2, return/1, fail/1]). %% This is really instance (Error e) => Monad (Either e) with 'error' %% for Left and 'ok' for Right. -type(monad(A) :: 'ok' | {'ok', A} | {'error', any()}). -include("monad_specs.hrl"). '>>='({error, _Err} = Error, _Fun) -> Error; '>>='({ok, Result}, Fun) -> Fun(Result); '>>='(ok, Fun) -> Fun(ok). return(ok) -> ok; return(X) -> {ok, X}. fail(X) -> {error, X}.