refactored for PointF & monad laws