Manual

using HermiteSpline
using StaticArrays

s = hermitespline(2)
push!(s, 0.0, @SVector([0.0, 0.0]), @SVector([0.0, +1.0]))
push!(s, 1.0, @SVector([1.0, 0.0]), @SVector([0.0, -1.0]))

length(s)      # 2
isempty(s)     # false
isascending(s) # true

rs = reverse(s)
@assert knots(rs) == reverse(knots(s))

isascending(rs) # false

# Enumerate control points

ts = knots(s)                  # may be generators or arrays
xs = collect(values(s))
dxs = collect(derivatives(s))

t t knot(s, 1)
t, x, dx = s[end]

t_x_dx == collect(s)     # ::Vector{Tuple{...}}
ts, xs, dxs = s[1:end]   # ::Tuple{Vector,...}

for (t, x, dx) in s
    # ...
end


#

# Evaluate explicit (copy of) piece

p = HermiteSpline.piece(s, 0.5)
x = p(0.5)
x = p(0.5, Value)
x, dx = p(0.5, ValueDerivative)


# Evaluate spline

x = s(0.5)
x = s(0.5)
x, dx = s(0.5, ValueDerivative)

idx = 1            # point-location: cache index of knot interval
(x, dx), idx = s(0.5, ValueDerivative, idx)
x, idx = s(0.5, Value, idx)

xs = s(range(0.0, 1.0, length=10), Value)
xs = s([0.0, 0.5, 1.0], Value)
xs = s([0.0, 0.5, 1.0], Value; sorted=true)
xs = s(rand(10000), Value; sorted=false) # possibly faster ...
xs = s(rand(10000), Value; sorted=true)  # ... than w/o presorting ts


# Concatenation

r = hermitespline(2)
push!(r, -1.0, @SVector([0.0, 0.0]), @SVector([0.0, +1.0]))
push!(r, 0.0, @SVector([1.0, 0.0]), @SVector([0.0, -1.0]))

h = vcat(r, s)

h2 = copy(r)      # alternative
append!(h2, s)

# Visualization

using Plots
plot(h)