-- Can use functions that return values in the monad
-- they do not need to include or terminate in a "gather"
-- they can also be recursive    
signin :: TwilioIVRCoroutine User
signin = do
    eid <- gather "Please enter your account id" (numDigits .~ 4)
    case filter (\u -> read (uid u) == eid) users of
        [] -> do
            say "Sorry, we don't recognize that id, please try again."
            signin
        [u] -> do
            say $ "Welcome " ++ (name u)
            return u
signin :: TwilioIVRCoroutine User
signin = do
    eid <- gather "Please enter your account id" (numDigits .~ 4)
    case filter (\u -> read (uid u) == eid) users of
        [] -> do
            say "Sorry, we don't recognize that id, please try again."
            signin
        [u] -> do
            say $ "Welcome " ++ (name u)
            return u
signin = do
    eid <- gather "Please enter your account id" (numDigits .~ 4)
    case filter (\u -> read (uid u) == eid) users of
        [] -> do
            say "Sorry, we don't recognize that id, please try again."
            signin
        [u] -> do
            say $ "Welcome " ++ (name u)
            return u