Help language development. Donate to The Perl Foundation

## eigenstates zef:lizmat last updated on 2022-07-29

dcc10b39bdfa1fc1be217eef25f2f8187cf2e80a/

# NAME

eigenstates - expose the eigenstates of an object

# SYNOPSIS

```use eigenstates;

say eigenstates(1|2|3);  # 1 2 3

say eigenstates(42);     # 42
```

# DESCRIPTION

The eigenstates distribution exports a single subroutine called `eigenstates` that returns a list of the eigenstates of an object. For all objects except `Junction`s, that's a list with the given object. For a `Junction`, it returns the internal values (aka "eigenstates") as a List.

# TECHNICAL BACKGROUND

Developers starting to use Raku often wonder why there is `Mu` class that is the parent of the `Any` class, with the `Any` class being the default class. The reason for this is the existence of `Junction`s. If you look at the parent classes of e.g. `Int`:

```say Int.^mro;       # ((Int) (Cool) (Any) (Mu))
```

However, if you look at the parent classes of `Junction`:

```say Junction.^mro;  # ((Junction) (Mu))
```

you will notice that `Junction` is NOT a subclass of `Any`. It is that fact that makes autothreading of values inheriting from `Any` work.

As a consequence, if you want to create a subroutine / method with a signature that will take a `Junction` "as is", you will need to give it a `Mu` constraint. Compare the behaviour of:

```sub auto-threading(\$value) {   # implicit Any
say \$value;
}
auto-threading( 42 | 666 );   # 42␤666␤
```

with:

```sub non-threading(Mu \$value) {
say \$value;
}
non-threading( 42 | 666 );   # any(42, 666)
```

# AUTHOR

Elizabeth Mattijsen [email protected]

Source can be located at: https://github.com/lizmat/eigenstates . Comments and Pull Requests are welcome.

If you like this module, or what I’m doing more generally, committing to a small sponsorship would mean a great deal to me!