reduce allocations in headPosition by converting from derivedProperty to manually managed property, see #50