Research Article

Behaviour Preservation across Code Versions in Erlang

Algorithm 3

string.erl (original and optimized versions).
Original version
(1) tokens(S, Seps) ->
(2)  tokens1(S, Seps, []).
(3) tokens1([CS], Seps, Toks) ->
(4) case member(C, Seps) of
(5)   true ->
(6)   tokens1(S, Seps, Toks);
(7)   false ->
(8)   tokens2(S, Seps, Toks, [C])
(9)  end;
(10) tokens1([], _Seps, Toks) ->
(11)  reverse(Toks).
(12) tokens2([CS], Seps, Toks, Cs) ->
(13)  case member(C, Seps) of
(14)   true ->
(15)   tokens1(S, Seps, [reverse(Cs)Toks]);
(16)   false ->
(17)   tokens2(S, Seps, Toks, [CCs])
(18)  end;
(19) tokens2([], _Seps, Toks, Cs) ->
(20)  reverse([reverse(Cs)Toks]).
Optimized version
(1) tokens(S, Seps) ->
(2)  case Seps of
(3)   [] ->
(4)    case S of
(5)     [] -> [];
(6)     [__] -> [S]
(7)    end;
(8)   [C] ->
(9)     tokens_single_1(reverse(S), C, []);
(10)   [__] ->
(11) tokens_multiple_1(reverse(S), Seps, [])
(12)  end.
(13) tokens_single_1([SepS], Sep, Toks) ->
(14)  tokens_single_1(S, Sep, Toks);
(15) tokens_single_1([CS], Sep, Toks) ->
(16)  tokens_single_2(S, Sep, Toks, [C]);
(17) tokens_single_1([], _, Toks) ->
(18)  Toks.
(19) tokens_single_2([SepS], Sep, Toks, Tok) ->
(20)  tokens_single_1(S, Sep, [TokToks]);
(21) tokens_single_2([CS], Sep, Toks, Tok) ->
(22)  tokens_single_2(S, Sep, Toks, [CTok]);
(23) tokens_single_2([], _Sep, Toks, Tok) ->
(24)  [TokToks].
(25) tokens_multiple_1([CS], Seps, Toks) ->
(26)  case member(C, Seps) of
(27)  true ->
(28)   tokens_multiple_1(S, Seps, Toks);
(29)  false ->
(30)   tokens_multiple_2(S, Seps, Toks, [C])
(31)  end;
(32) tokens_multiple_1([], _Seps, Toks) ->
(33)  Toks.
(34) tokens_multiple_2([CS], Seps, Toks, Tok) ->
(35)  case member(C, Seps) of
(36)  true ->
(37)   tokens_multiple_1(S, Seps, [TokToks]);
(38)  false ->
(39)   tokens_multiple_2(S, Seps, Toks, [CTok])
(40)  end;
(41) tokens_multiple_2([], _Seps, Toks, Tok) ->
(42)  [TokToks].