# cosmo isequalnΒΆ

function tf=cosmo_isequaln(x,y)
% compares two input for equality with NaNs considered being equal
%
% tf=cosmo_isequaln(x,y)
%
% Inputs:
%   x                   first input
%   y                   second input, to be compared with first input
%
% Output:
%   tf                  true if x and y are equal, with NaNs considered
%                       to be equal; false otherwise
%
% Examples:
%    cosmo_isequaln(2,2)
%    > true
%    cosmo_isequaln(2,3)
%    > false
%    % using the builtin isequal, NaNs are considered not equal
%    isequal(NaN,NaN)
%    > false
%    % using cosmo_isequaln, NaNs are considered to be equal to each other
%    cosmo_isequaln(NaN,NaN)
%    > true

% Notes:
%   - in earlier versions of Matlab, isequaln did not exist;
%     isequalwithequalnans was used instead. However isequaln will be
%     deprecated in GNU Octave 4.2. This function is there included for
%     compatibility with both old versions of Matlab and future versions of
%     GNU Octave
%

comparison_func=get_comparison_func();
tf=comparison_func(x,y);

function func=get_comparison_func()
persistent cached_comparison_func

if isempty(cached_comparison_func)
cached_comparison_func=find_comparison_func_helper();
end

func=cached_comparison_func;

function func=find_comparison_func_helper()
candidates_str={'isequaln','isequalwithequalnans'};

has_func=@(x)~isempty(which(x,'builtin'));
idx=find(cellfun(has_func,candidates_str),1,'first');
if ~isempty(idx)
func=str2func(candidates_str{idx});
return
end

error('No comparison function found from candidates: %s',...
cosmo_strjoin(candidates_str,', '));