separate curryable into its own file and tests