<div dir="ltr">If brick really doesn't provide a way to override the input handle, your best bet is to use System.Posix.IO.dup to "copy" the original stdInput pipe to a new file descriptor, fdClose stdInput, openFd /dev/tty, dupTo the handle to stdInput (== 0) if necessary (POSIX says it is, actual Unixes will have opened /dev/tty on to fd 0 already if you closed it first), then use fdToHandle to get a handle for the new pipe. Don't do any IO on the pipe before doing this, or there will be no safe way to synchronize the existing Handle with its new fd. The mappings between the things in <a href="http://System.Posix.IO">System.Posix.IO</a> and the underlying Unix / POSIX syscalls is fairly obvious if you already know the latter; the only new ones are fdToHandle and handleToFd which correspond to C stdio's openfd() and fileno().</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Oct 26, 2019 at 9:17 AM Aramís Concepción Durán <<a href="mailto:aramis@systemli.org">aramis@systemli.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello,<br>
<br>
I'm trying to write a program that first reads input from<br>
a pipe and then reads keyboard input from the user (like<br>
fzf, the fuzzy finder).<br>
<br>
Under different circumstances I could open a handle to<br>
`/dev/tty` and use the `hGet...` functions from `System.IO`<br>
to get the user's keyboard input, but I'm constructing the<br>
text user interface with the brick library, which doesn't<br>
seem to give my any way to sneak in alternative handles<br>
through its application entry point functions.<br>
<br>
So, what I'm looking for is a function which takes an<br>
`IO ()` function like the usual `main` and a `Handle`<br>
and turns it into an `IO ()` function that reads from the<br>
provided handle instead of `stdin`.<br>
<br>
Does that make sense?  I might be looking for something<br>
that doesn't exist.  Or I'm lacking the language to get<br>
results from a search engine.<br>
<br>
To illustrate the problem further, here is a condensed<br>
brick application:<br>
<br>
    import qualified Brick.Main     as Main<br>
    import qualified Brick.Types    as Types<br>
    import qualified Graphics.Vty   as Vty<br>
<br>
    import Brick.AttrMap        ( attrMap )<br>
    import Brick.Widgets.Core   ( str )<br>
<br>
    type Event = Types.EventM () ( Types.Next () )<br>
<br>
    main =<br>
        let<br>
            app =<br>
                Main.App <br>
                    { Main.appChooseCursor = Main.neverShowCursor<br>
                    , Main.appHandleEvent = \ _ _ -> Main.halt () :: Event<br>
                    , Main.appStartEvent = pure<br>
                    , Main.appAttrMap = \ _ -> attrMap Vty.currentAttr []<br>
                    , Main.appDraw = \ _ -> [ str Hit any key to exit. ]<br>
                    }<br>
        in<br>
            Main.defaultMain app ()<br>
<br>
How do I get this `main` function to read from a custom<br>
handle intead of stdin?<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div>brandon s allbery kf8nh</div><div><a href="mailto:allbery.b@gmail.com" target="_blank">allbery.b@gmail.com</a></div></div></div></div></div>