
  [;1m-spec erlang:fun_info(Fun) -> [{Item, Info}][0m
  [;1m                         when[0m
  [;1m                             Fun :: function(),[0m
  [;1m                             Item ::[0m
  [;1m                                 arity | env | index | name | module |[0m
  [;1m                                 new_index | new_uniq | pid | type |[0m
  [;1m                                 uniq,[0m
  [;1m                             Info :: term().[0m

  Returns a list with information about the fun [;;4mFun[0m. Each list
  element is a tuple. The order of the tuples is undefined, and more
  tuples can be added in a future release.

  Warning:
    This BIF is mainly intended for debugging, but it can
    sometimes be useful in library functions that need to verify,
    for example, the arity of a fun.

  Two types of funs have slightly different semantics:

   • A fun created by [;;4mfun M:F/A[0m is called an external fun.
     Calling it will always call the function [;;4mF[0m with arity [;;4mA[0m
     in the latest code for module [;;4mM[0m. Notice that module [;;4mM[0m
     does not even need to be loaded when the fun [;;4mfun M:F/A[0m is
     created.

   • All other funs are called local. When a local fun is
     called, the same version of the code that created the fun is
     called (even if a newer version of the module has been
     loaded).

  The following elements are always present in the list for both
  local and external funs:

  [;;4m[;;4m{type, Type}[0m[0m:
    [;;4mType[0m is [;;4mlocal[0m or [;;4mexternal[0m.

  [;;4m[;;4m{module, Module}[0m[0m:
    [;;4mModule[0m (an atom) is the module name.

    If [;;4mFun[0m is a local fun, [;;4mModule[0m is the module in which the
    fun is defined.

    If [;;4mFun[0m is an external fun, [;;4mModule[0m is the module that the
    fun refers to.

  [;;4m[;;4m{name, Name}[0m[0m:
    [;;4mName[0m (an atom) is a function name.

    If [;;4mFun[0m is a local fun, [;;4mName[0m is the name of the local
    function that implements the fun. (This name was generated by
    the compiler, and is only of informational use. As it is a
    local function, it cannot be called directly.) If no code is
    currently loaded for the fun, [;;4m[][0m is returned instead of an
    atom.

    If [;;4mFun[0m is an external fun, [;;4mName[0m is the name of the
    exported function that the fun refers to.

  [;;4m[;;4m{arity, Arity}[0m[0m:
    [;;4mArity[0m is the number of arguments that the fun is to be called
    with.

  [;;4m[;;4m{env, Env}[0m[0m:
    [;;4mEnv[0m (a list) is the environment or free variables for the
    fun. For external funs, the returned list is always empty.

  The following elements are only present in the list if [;;4mFun[0m is
  local:

  [;;4m[;;4m{pid, Pid}[0m[0m:
    [;;4mPid[0m is the process identifier of the process that originally
    created the fun.

    It might point to the [;;4minit[0m process if the [;;4mFun[0m was
    statically allocated when module was loaded (this optimisation
    is performed for local functions that do not capture the
    environment).

    Change:
      In Erlang/OTP 27, we plan to change the return value so
      that it always points to the local [;;4minit[0m process,
      regardless of which process or node the fun was originally
      created on. See Upcoming Potential Incompatibilities .

  [;;4m[;;4m{index, Index}[0m[0m:
    [;;4mIndex[0m (an integer) is an index into the module fun table.

  [;;4m[;;4m{new_index, Index}[0m[0m:
    [;;4mIndex[0m (an integer) is an index into the module fun table.

  [;;4m[;;4m{new_uniq, Uniq}[0m[0m:
    [;;4mUniq[0m (a binary) is a unique value for this fun. It is
    calculated from the compiled code for the entire module.

  [;;4m[;;4m{uniq, Uniq}[0m[0m:
    [;;4mUniq[0m (an integer) is a unique value for this fun. As from
    Erlang/OTP R15, this integer is calculated from the compiled
    code for the entire module. Before Erlang/OTP R15, this
    integer was based on only the body of the fun.
