# `Sidereon.GNSS.PreciseEphemeris.InterpolantArtifact`
[🔗](https://github.com/neilberkman/sidereon-ex/blob/main/lib/sidereon/gnss/precise_ephemeris/interpolant_artifact.ex#L1)

Opened precise-ephemeris interpolant artifact.

Artifact bytes are produced by the core precise-interpolant store writer and
can be reopened without reparsing the original SP3 product. This module gives
that artifact path a named public struct while delegating all native work to
`Sidereon.GNSS.PreciseEphemeris.Interpolant`.

# `source`

```elixir
@type source() ::
  Sidereon.GNSS.SP3.t()
  | Sidereon.GNSS.PreciseEphemeris.Interpolant.t()
  | t()
  | binary()
```

# `t`

```elixir
@type t() :: %Sidereon.GNSS.PreciseEphemeris.InterpolantArtifact{
  interpolant: Sidereon.GNSS.PreciseEphemeris.Interpolant.t()
}
```

Opened precise-interpolant artifact handle.

# `artifact_bytes`

```elixir
@spec artifact_bytes(
  Sidereon.GNSS.SP3.t()
  | Sidereon.GNSS.PreciseEphemeris.Interpolant.t()
  | t()
) ::
  {:ok, binary()} | {:error, term()}
```

Build canonical artifact bytes from an SP3 product, an interpolant, or an opened artifact.

# `as_bytes`

```elixir
@spec as_bytes(t()) :: {:ok, binary()} | {:error, term()}
```

Return the artifact bytes backing this opened handle.

# `byte_len`

```elixir
@spec byte_len(t()) :: {:ok, non_neg_integer()} | {:error, term()}
```

Return the artifact byte length.

# `checksum64`

```elixir
@spec checksum64(source()) :: {:ok, non_neg_integer()} | {:error, term()}
```

Alias for `checksum/1`.

# `checksum`

```elixir
@spec checksum(source()) :: {:ok, non_neg_integer()} | {:error, term()}
```

Return the artifact checksum for bytes, an interpolant, or an opened artifact.

# `from_bytes`

```elixir
@spec from_bytes(binary()) :: {:ok, t()} | {:error, term()}
```

Alias for `open/1`.

# `from_path`

```elixir
@spec from_path(String.t()) :: {:ok, t()} | {:error, term()}
```

Read artifact bytes from disk and open them.

# `open`

```elixir
@spec open(binary()) :: {:ok, t()} | {:error, term()}
```

Open precise-interpolant artifact bytes into a named artifact handle.

# `satellite_ids`

```elixir
@spec satellite_ids(t()) :: [String.t()]
```

Return the satellite ids available in the artifact.

# `satellites`

```elixir
@spec satellites(t()) :: [String.t()]
```

Alias for `satellite_ids/1`.

# `states_at_j2000_s`

```elixir
@spec states_at_j2000_s(t(), [String.t()], [number()]) ::
  {:ok, Sidereon.GNSS.PreciseEphemeris.StateBatch.t()} | {:error, term()}
```

Evaluate states for parallel satellite and epoch arrays.

# `states_at_shared_j2000_s`

```elixir
@spec states_at_shared_j2000_s(t(), [String.t()], number()) ::
  {:ok, Sidereon.GNSS.PreciseEphemeris.StateBatch.t()} | {:error, term()}
```

Evaluate states for many satellites at one shared J2000-second epoch.

# `time_scale`

```elixir
@spec time_scale(t()) :: String.t()
```

Return the source time-scale abbreviation, such as `"GPST"`.

# `to_interpolant`

```elixir
@spec to_interpolant(t()) :: Sidereon.GNSS.PreciseEphemeris.Interpolant.t()
```

Return the underlying interpolant handle for APIs that accept interpolant sources.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
