anchor.diff:           add_package_version/3,
            add_package_version/4,
            parse_version/1,
  +         is_valid_constraint/1,
            filter_packages/2]).
   
   %% Internally Exported API. This should *not* be used outside of the rcl_depsolver
  
positive.code:     Pkg;
  dep_pkg(Pkg) when is_atom(Pkg) orelse is_binary(Pkg) ->
      Pkg.
  
  -spec is_valid_constraint(constraint()) -> boolean().
  is_valid_constraint(Pkg) when is_atom(Pkg) orelse is_binary(Pkg) ->
      true;
  is_valid_constraint({_Pkg, Vsn}) when is_tuple(Vsn) ->
      true;
  is_valid_constraint({_Pkg, Vsn, '='}) when is_tuple(Vsn) ->
      true;
  is_valid_constraint({_Pkg, _LVsn, gte}) ->
      true;
  is_valid_constraint({_Pkg, _LVsn, '>='}) ->
      true;
  is_valid_constraint({_Pkg, _LVsn, lte}) ->
      true;
  is_valid_constraint({_Pkg, _LVsn, '<='}) ->
      true;
  is_valid_constraint({_Pkg, _LVsn, gt}) ->
      true;
  is_valid_constraint({_Pkg, _LVsn, '>'}) ->
      true;
  is_valid_constraint({_Pkg, _LVsn, lt}) ->
      true;
  is_valid_constraint({_Pkg, _LVsn, '<'}) ->
      true;
  is_valid_constraint({_Pkg, _LVsn, pes}) ->
      true;
  is_valid_constraint({_Pkg, _LVsn, '~>'}) ->
      true;
  is_valid_constraint({_Pkg, _LVsn1, _LVsn2, between}) ->
      true;
  is_valid_constraint(_InvalidConstraint) ->
      false.
  
  -spec add_constraint(pkg_name(), vsn(), [constraint()],constraint()) -> ordered_constraints().
  add_constraint(SrcPkg, SrcVsn, PkgsConstraints, PkgConstraint) ->
  
negative.code:             end
      end.
  
  %% @doc Parse a string version into a tuple based version
  -spec parse_version(raw_vsn() | vsn()) -> vsn().
  parse_version(RawVsn)
    when erlang:is_list(RawVsn);
  