Go to the first, previous, next, last section, table of contents.


]queryForChoice

Function: ]queryForChoice { what was -> result }
file: 10-C-utils.t
package: muf
status: alpha

This function prompts the user to select one of a given set (block) of strings. It loops until the user enters the number of a valid string, then returns both the selected string and its offset within the block (zero to n-1).

Note that it may easily be adapted to select from a set of nonstring values:

[ "Pat" "Kim" | "Pick mate" ]queryForChoice pop -> choice
[ .u.pat .u.kim | choice dupNth -> choice ]pop
choice

will return one of .u.pat or .u.kim.

It is currently implemented as:

: ]queryForChoice { [] $ -> $ $ } -> prompt
    |length -> len
    do{
        prompt length 0 = if
          "\nPick one:\n" @$s.queryOutput writeStream
            "---------\n" @$s.queryOutput writeStream
        else
            [ "\n%s:\n" prompt | ]print @$s.queryOutput writeStream
        fi

        0 -> i
       |for choice do{
            i 1 + -> i      

            [ "%d) %s\n" i choice
            | ]print @$s.queryOutput writeStream
        }

        @$s.queryInput readStreamLine pop trimString -> string
        string stringInt 1 - -> result

        result 0 <= if
            "Sorry, choice must be at least 1\n"
            @$s.queryOutput writeStream
            continue
        fi

        result len >= if
            [ "Sorry, choice must be at most %d\n" len
            | ]print  @$s.queryOutput writeStream
            continue
        fi

        result |dupNth -> resultString
        ]pop
        result resultString return
    }
;
']queryForChoice export


Go to the first, previous, next, last section, table of contents.