Current section

Files

Jump to
dec src dec.erl
Raw

src/dec.erl

-module(dec).
-compile(export_all).
-include("money.hrl").
-export([start/2, stop/1, init/1]).
stop(_) -> ok.
init([]) -> {ok, { {one_for_one, 5, 10}, []} }.
start(_, _) -> supervisor:start_link({local, ?MODULE}, ?MODULE, []).
pow(X,0) -> 1;
pow(X,Y) -> X * pow(X,Y-1).
mul({A,B},{C,D}) -> norm({A+C,B*D}).
'div'({A,N},{C,D}) -> norm({A+C,N*pow(10,A+C+1) div D}).
norm({0,B}) -> {0,B};
norm({A,B}) when B rem 10 == 0 -> norm({A-1,B div 10});
norm({A,B}) -> {A,B}.
lift({X,Y},N) -> {X+N,N*pow(10,N)}.
nsub({A,_}=X,{C,_}=Y) when A > C -> nsub(X,lift(Y,A-C));
nsub({A,_}=X,{C,_}=Y) when C > A -> nsub(lift(X,C-A),Y);
nsub({X,B}=A,{X,D}=C) -> norm({X,B-D}).
sub(A,B) -> nsub(norm(A),norm(B)).
nadd({A,_}=X,{C,_}=Y) when A > C -> nadd(X,lift(Y,A-C));
nadd({A,_}=X,{C,_}=Y) when C > A -> nadd(lift(X,C-A),Y);
nadd({X,B}=A,{X,D}=C) -> norm({X,B+D}).
add(A,B) -> nadd(norm(A),norm(B)).