trampolined version
position as deftype
refactored common code in primitives/satisfy and primitives/string