anchor.diff:  swap([X,Y,Z|T], []) ->
       swap(T, [[Y, X, Z], [Z, Y, X], [X, Z, Y]]);
   swap([X,Y,Z|T], P) ->
  -    swap(T, dist:dist(P, [[X,Z,Y],[Y,X,Z],[Z,Y,X]]));
  +    swap(T, dist:dist(P, [[Y,X,Z],[Z,Y,X],[X,Z,Y]]));
   swap([A], P) ->
       dist([A], P).
   
  +split([]) ->
  +    [];
  +split([_]) ->
  +    [];
  +split([H|T]) -> 
  +    split(T, [H]).
  +
  +split(L, R) when length(L) =:= length(R);
  +		 length(L) =:= length(R) + 1 ->
  +    {R, L};
  +split([H|T], R) ->
  +    split(T, [H|R]).
  +
   swap_2500_profile() ->
  -     {X, _O} = timer:tc(?MODULE, swap, [lists:seq(1, 2500)]), 
  +     {X, _O} = timer:tc(?MODULE, swap_tail2, [lists:seq(1, 2500)]), 
        io:fwrite("Profile: ~p microsends~n", [X]).
   
   swap_test_one_test_() ->
       {"Swap [a] must yeild in [a]", ?_assertEqual([a], swap([a]))}.
   
  -swap_test_() ->
  +swap_tail2_test_() ->
       {"swapping '[1,2,3]' must result in '[2,1,3], [3,2,1], [1,3,2]'", 
  -     ?_assertEqual([[2,1,3], [3,2,1], [1,3,2]], swap([1,2,3]))}.
  +     ?_assertEqual([[2,1,3], [3,2,1], [1,3,2]], swap_tail2([1,2,3]))}.
  +
  +swap2_test_() ->
  +    {"swapping '[1,2,3]' must result in '[2,1,3], [3,2,1], [1,3,2]'", 
  +     ?_assertEqual([[2,1,3], [3,2,1], [1,3,2]], swap2([1,2,3]))}.
  +
   
   swap_empty_test_() ->
       {"swapping '[]' must result in '[]'", 
  
positive.code: -module(swap).
  -export([swap/1, swap_2500_profile/0]).
  -include_lib("eunit/include/eunit.hrl").
  -import(dist, [dist/2]).
  -import(umerge, [umerge/2]).
  
  swap(L) ->
      swap(L, []).
  
  swap([], P) ->
  
negative.code: swap_7_elem_list_test_() ->
      {"swap [1,2,3,4,5,6,7] must halt and equal expected",
       ?_assertEqual(
  	[],lists:subtract([[7,3,1,2,6,5,4],
  	 [7,3,1,2,5,4,6],
  	 [7,3,1,2,4,6,5],
  	 [7,1,2,3,6,5,4],
  