#lang scribble/doc
@(require "common.rkt" (for-label mrlib/interactive-value-port scheme/pretty))

@title{Interactive Value Port}

@defmodule[mrlib/interactive-value-port]


@defproc[(set-interactive-display-handler
          [port output-port?]
          [#:snip-handler snip-handler
           (or/c #f (-> (is-a?/c snip%) output-port? any))
           #f])
         void?]{

 Sets @racket[port]'s display handler (via
 @racket[port-display-handler]) so that when it encounters
 these values:
 @itemize[@item{syntax objects}
          @item{snips}]

 it uses @racket[write-special] to send snips to the port
 and uses @racketmodname[mrlib/syntax-browser] to turn
 syntax object into snips and then uses
 @racket[write-special] with the result to send it to the
 port. Otherwise, it behaves like the default handler.

 If @racket[snip-handler] is not @racket[#f], then
 @racket[set-interactive-display-handler] passes any snips
 to it (not those it creates by
 @racketmodname[mrlib/syntax-browser]) instead of calling 
 @racket[write-special].

 To show values embedded in lists and other compound object,
 it uses @racket[pretty-display].
}


@defproc[(set-interactive-write-handler
          [port output-port?]
          [#:snip-handler snip-handler
           (or/c #f (-> (is-a?/c snip%) output-port? any))
           #f])
         void?]{

Like @racket[set-interactive-display-handler], but sets the
@racket[port-write-handler] and uses @racket[pretty-write].}


@defproc[(set-interactive-print-handler
          [port output-port?]
          [#:snip-handler snip-handler
           (or/c #f (-> (is-a?/c snip%) output-port? any))
           #f])
         void?]{

Like @racket[set-interactive-display-handler], but sets the
@racket[port-print-handler] and uses @racket[pretty-print].}