package com.jetbrains.python.numpy.codeInsight;

import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.List;

public final class NumpyUfuncs {
  private static final List<String> UFUNC_LIST = new ArrayList<>();

  public static boolean isUFunc(final @Nullable String name) {
    return UFUNC_LIST.contains(name);
  }

  static {
    //Math operations
    UFUNC_LIST.add("add");
    UFUNC_LIST.add("subtract");
    UFUNC_LIST.add("multiply");
    UFUNC_LIST.add("divide");
    UFUNC_LIST.add("logaddexp");
    UFUNC_LIST.add("logaddexp2");
    UFUNC_LIST.add("true_divide");
    UFUNC_LIST.add("floor_divide");
    UFUNC_LIST.add("negative");
    UFUNC_LIST.add("power");
    UFUNC_LIST.add("remainder");
    UFUNC_LIST.add("mod");
    UFUNC_LIST.add("fmod");
    UFUNC_LIST.add("absolute");
    UFUNC_LIST.add("rint");
    UFUNC_LIST.add("sign");
    UFUNC_LIST.add("conj");
    UFUNC_LIST.add("exp");
    UFUNC_LIST.add("exp2");
    UFUNC_LIST.add("log");
    UFUNC_LIST.add("log2");
    UFUNC_LIST.add("log10");
    UFUNC_LIST.add("expm1");
    UFUNC_LIST.add("log1p");
    UFUNC_LIST.add("sqrt");
    UFUNC_LIST.add("square");
    UFUNC_LIST.add("reciprocal");
    UFUNC_LIST.add("ones_like");

    //Trigonometric
    UFUNC_LIST.add("sin");
    UFUNC_LIST.add("cos");
    UFUNC_LIST.add("tan");
    UFUNC_LIST.add("arcsin");
    UFUNC_LIST.add("arccos");
    UFUNC_LIST.add("arctan");
    UFUNC_LIST.add("arctan2");
    UFUNC_LIST.add("hypot");
    UFUNC_LIST.add("sinh");
    UFUNC_LIST.add("cosh");
    UFUNC_LIST.add("tanh");
    UFUNC_LIST.add("arcsinh");
    UFUNC_LIST.add("arccosh");
    UFUNC_LIST.add("arctanh");
    UFUNC_LIST.add("deg2rad");
    UFUNC_LIST.add("rad2deg");

    //Bit-twiddling functions
    UFUNC_LIST.add("bitwise_and");
    UFUNC_LIST.add("bitwise_or");
    UFUNC_LIST.add("bitwise_xor");
    UFUNC_LIST.add("invert");
    UFUNC_LIST.add("left_shift");
    UFUNC_LIST.add("right_shift");

    //Comparison functions
    UFUNC_LIST.add("greater");
    UFUNC_LIST.add("greater_equal");
    UFUNC_LIST.add("less");
    UFUNC_LIST.add("less_equal");
    UFUNC_LIST.add("not_equal");
    UFUNC_LIST.add("equal");
    UFUNC_LIST.add("logical_and");
    UFUNC_LIST.add("logical_or");
    UFUNC_LIST.add("logical_xor");
    UFUNC_LIST.add("logical_not");
    UFUNC_LIST.add("maximum");
    UFUNC_LIST.add("minimum");
    UFUNC_LIST.add("fmax");
    UFUNC_LIST.add("fmin");

    ///Floating functions
    UFUNC_LIST.add("isreal");
    UFUNC_LIST.add("iscomplex");
    UFUNC_LIST.add("isfinite");
    UFUNC_LIST.add("isinf");
    UFUNC_LIST.add("isnan");
    UFUNC_LIST.add("signbit");
    UFUNC_LIST.add("copysign");
    UFUNC_LIST.add("nextafter");
    UFUNC_LIST.add("modf");
    UFUNC_LIST.add("ldexp");
    UFUNC_LIST.add("frexp");
    UFUNC_LIST.add("fmod");
    UFUNC_LIST.add("floor");
    UFUNC_LIST.add("ceil");
    UFUNC_LIST.add("trunc");

    UFUNC_LIST.add("fabs");
  }
}
