why wrapping S here rather than leave it opaque? Seems like the previous PR did the opposite: move from `(Timestamp, T) => T`, here we are taking (what I think) is an opaque parameter `S` and putting structure we don't use. Why not just instantiante with `S=InputState[S1]` for some `S1`?