def linear_deadzone(deadzone: float) -> DeadzoneCallable:
    """
        Real motors won't actually move unless you give them some minimum amount
        of input. This computes an output speed for a motor and causes it to
        'not move' if the input isn't high enough. Additionally, the output is
        adjusted linearly to compensate.
        
        Example: For a deadzone of 0.2:
        
        * Input of 0.0 will result in 0.0
        * Input of 0.2 will result in 0.0
        * Input of 0.3 will result in ~0.12
        * Input of 1.0 will result in 1.0
        
        This returns a function that computes the deadzone. You should pass the
        returned function to one of the drivetrain simulation functions as the
        ``deadzone`` parameter.
        
        :param motor_input: The motor input (between -1 and 1)
        :param deadzone: Minimum input required for the motor to move (between 0 and 1)
    """
    assert 0.0 < deadzone < 1.0
    scale_param = 1.0 - deadzone

    def _linear_deadzone(motor_input):
        abs_motor_input = abs(motor_input)
        if abs_motor_input < deadzone:
            return 0.0
        else:
            return math.copysign(
                (abs_motor_input - deadzone) / scale_param, motor_input
            )

    return _linear_deadzone