w      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  None[\ tKeeps track of the lines of text to display, the current scroll positions, and the set of highlighted line numbers. 2The current column offset for horizontal scrollingDSet of line numbers that are highlighted (i.e. they contain matches)Zipper: Lines above the screen!Zipper: Lines on screen and below.The number of invisible lines above the screen     None[\lThe internal state of the split-view widget. Tracks the state of both child widgets and the current layout.!State of the left widget"State of the right widget#Current layout)"The currently focused child widgetGview currentWidget $ HSplit { _leftWidget = "foo", _layout = LeftOnly } Left "foo"*$Traverses the left widget if focused5has leftWidgetFocused $ HSplit { _layout = LeftOnly }True6has leftWidgetFocused $ HSplit { _layout = RightOnly }FalseDhas leftWidgetFocused $ HSplit { _layout = Split FocusLeft (1 % 2) }True+%Traverses the right widget if focused7has rightWidgetFocused $ HSplit { _layout = RightOnly }True6has rightWidgetFocused $ HSplit { _layout = LeftOnly }FalseFhas rightWidgetFocused $ HSplit { _layout = Split FocusRight (1 % 2) }True !"#&'()*+ !"#&'()*+ !"#'(&)*+  !"#&'()*+Safe[\ ,-./0123456 ,-./0123456 4560123,-./,-./0123456None[\=.Ad-hoc data structure to render the (visible) A as list of lines.AResults widget stateBThe results list is emptyC7The structure of the Results buffer is a double Zipper:lines above the current screen&lines on screen above the current itemthe current item&lines on screen below the current itemlines below the current screenDAppend a line to the A9. The line is appended below the visible screen, so use E to make it visible. Reverse the AE<Show one more item at the bottom of the screen if available.F9Show one more item at the top of the screen if available.G`Remove the last item from the bottom of the screen and prepend it to the invisible items below.H]Remove the first item from the top of the screen and append it to the invisible items above.IMove the cursor one item down.JMove the cursor one item up.K9Adjust the number of on-screen items to the given height:If the current list is too long for the new height, take items from the top until the current item is topmost, then from the bottom.lIf the current list is too short for the new height, add items below until the buffer is empty, then above.LConverts the visible A to a list of =Hs. Each item in the returned list corresponds to a line on the screen.Each group of ?4s that points to the same file is prepended with a >&. The item below the cursor becomes a @.MThe line number of a =.  for >s.N,The file name of the currently selected itemO.The line number of the currently selected itemPJThe line numbers with matches in the file of the currentliy selected item=>?@ABCDEFGHIJKthe new height! if the height has not changed,  newResults otherwiseLMNOP=?>@ACBDEFGHIJKLMNOPABCNOPDFEHGJIK=>?@LM=>?@ABCDEFGHIJKLMNOPSafe[\TParses lines of $, skipping lines that are not valid grep output.UParses a line of grep output. Returns  if the line cannot be parsed.\The output should consist of a file name, line number and the content, separated by colons:#parseLine "path/to/file:123:foobar"Just (FileLineReference {getFile = File {getFileName = "path/to/file"}, getLineReference = LineReference {getLineNumber = Just 123, getLineText = "foobar"}})5Omitting the line number still produces valid output:parseLine "path/to/file:foobar"Just (FileLineReference {getFile = File {getFileName = "path/to/file"}, getLineReference = LineReference {getLineNumber = Nothing, getLineText = "foobar"}})&However, an file name must be present:parseLine "foobar"NothingTU,TUTU,TUSafeOT[\VLike WT, but if the input is not prefixed with a file and line number, i. e. is not valid grep -nH output, then adds -nH (-n: with line number, -H: with file name) to the grep command line arguments.WTakes a  stream and runs it through a grepi process, returning a stream of results. The original command line arguments are passed to the process.XInvokes  grep -nH -rI (-n: with line number, -H: with file name, -r : recursive, -I: ignore binary files) and returns the results as a stream. More arguments (e. g. pattern and directory) are taken from the command line.VWXYVWXYWVXYVWXY None[\ \Line numbers (default: blue)]-Highlighted line numbers (default: bold blue)^'Normal text (default: terminal default)_ Highlighted text (default: bold)`QFile names in results view (default: terminal default color on green background)a4Selected entry (default: terminal default, inverted)dColor configurationeTabstop width (default: 8)fExecutable for e$ key (default: environment variable $EDITOR, or vi if $EDITOR is not set)Z[\]^_`abcdefklmnopqrstuZ[\]^_`abcdefklmnopqrstubcdefZ[\]^_`amlksrqpontu Z[\]^_`abcdefklmnopqrstu None[\v' actions can read from the environment.x5External configuration (colors, editor executable, &)y?The bounds (width and height) of the display region where the  or the current  is displayedvwxy|}g      !"#$%&'()*+,-./0Z[\]^_`abcdefklmnopqrstuvwyx|}vwxy|}vwxy|} NoneOT[\ mSuspend the application and run the action, e. g. invoking an external process, then resume the application. Shut down.VIndicates that the state has been changed visibly, so the screen should be refreshed.hThe state has not changed or the change would not be visible, so refreshing the screen is not required./The type of action to be performed on an event.>Do not handle the event (fall-through to other event handlers)(Handle the event by performing an actionInterrupt the applicationIf the lookup returns  action, then handle it with  action' , otherwise  this event handler.Special case of ( where actions are looked up from a map.=The first event handler that triggers (i. e. does not return ) handles the event.~12~ ~~ None:[\Expand a list of linesExpand a single line345345 Safe[\H6789:;<=      >!#$%&'()?@ABCDEFGHIJKLMNONone 9;<=DILR[\The 3 monad transformer is parameterized over the state s of a  or an .Lift a monadic action to .Pass an initial state and an v and reduce a ( action to an action in the base monad. A version of P where the action is lifted to .The v of  is not stateful, however it can be modified globally. An example is resizing the application by changing the display bounds. can read from the vD. Modifications to the enviromnent are only possible globally (see ), the Q environment is pure. Rv89;SQT      !"#$%&'()*+,-@./0Z[\]^_`abcdefklmnopqrstuvwyx|} RNoneOT[\A S is a unit that is displayed on the screen. It is associated with a mutable state sW. It provides an event handler with default keybindings and can generate a renderable U. Widget modules should provide a c instance and additionally a collection of actions that can be invoked by external event handlers: widgetAction ::  s m  The initial state of the widgetGenerate a renderable UH from the widget state. The state can be modified (e. g. for resizing).#The default event handler for this (. May provide e.g. default keybindings. None[\ None[\ Compose two s side-by-side Initial state3Initially, the left widget is rendered full-screen.Drawing the Widgets\Drawing is delegated to the child widgets in a local environment reduced to thir respective 0.Default keybindings]Events are routed to the focused widget. Additionally, the following keybindings are defined: Tab  f full screen ( / ) q close right widget ( if right widget is focused) #Display the left widget full-screen$Display the right widget full-screen%Display both widgets in a split view.JSwitch focus from left to right child widget and vice versa (only if the # is ) VFocus left or right area,Left area width as fraction of overall widthWXYZ[\'()*+'()*+ VWXYZ[\None!"[\'Display lines of text with line numbers Initial state6The pager is empty, i. e. no lines of text to display.Drawing the pager The lines of text are printed, starting at the current scroll position. If not enough lines are available, the scroll position is adjusted until either the screen is filled, or the first line is reached. Highlighted lines are displayed according to the config values r and p (default: bold).Default keybindings !!!!, hjkl  (-1),  1,  (-1),  1 PgUp, PgDn  (-1),  1 %Replace the currently displayed text. Scroll to the given line number.Scroll up or down one line. Gscroll (-1) -- scroll one line up scroll 1 -- scroll one line down~Scroll up or down one page. The first line on the current screen will be the last line on the scrolled screen and vice versa. OscrollPage (-1) -- scroll one page up scrollPage 1 -- scroll one page down'Horizontal scrolling. Increment is one m. RhScroll (-1) -- scroll one tabstop left hScroll 1 -- scroll one tabstop right ]^<Lines of text to display in the pager (starting with line 1)/List of line numbers that should be highlighted_`  ]^_`NoneOT[\QThe results widget displays a list of lines with line numbers, grouped by files. Initial stateAThe initial buffer is empty and can be filled line by line using .Drawing the results list,Found matches are grouped by file name. Each file group has a header and a list of result lines with line numbers. The result lines can be selected with the cursor, the file group headers are skipped. When only part of a file group is shown at the top of the screen, the header is shown nevertheless.Default keybindings  jk, !! ,  PgDn, PgUp ,  Add a line to the results list. If the result is found in the same file as the current last result, it will be added to the same results group, otherwise a new group will be opened.BMove up/down one results page. File group headers will be skipped.BMove up/down one results page. File group headers will be skipped.BMove up/down one results line. File group headers will be skipped.BMove up/down one results line. File group headers will be skipped.abcdefgh,-./0123456ANOP ANOPabcdefghSafe[\ 7 is an unbounded priority queue based on a Finger Tree. Build a new .IO version of ). This is useful for creating top-level TPQueues using unsafePerformIO, because using i inside unsafePerformIO isn't possible.Write a value to a .#Read the next minimal value from a . A version of " that does not retry, but returns # instead if no value is available."Get the next minimal value from a  without removing it. A version of " that does not retry, but returns # instead if no value is available.Returns j if the  is empty. kl klSafe[\BSpawn a mailbox to store prioritized messages in a Mailbox. Using  on the  will return  the minimal element, or  if the mailbox is closed.This function is analogous to Pipes.Concurrent. , but it uses a  instead of a m to store messages. passes its enclosed action an   and  like you'd get from , but automatically sealGs them after the action completes. This can be used when you need the sealing behavior available from *, but want to work at a bit higher level: *withSpawn buffer $ \(output, input) -> ..." is exception-safe, since it uses P internally.    NoneLOT[\ no% events do have higher priority than pZ events, so that the application stays responsive even in case of event queue congestion.The % type is parameterized over the type e$ of events it handles and the type s of its state.&Creates the initial state for the app.How to convert an external q to the App's event5Handles an event, possibly modifying the App's state.  handleEvent e s = case e of r s [] ->  ( ) -- Handles the Enter key, but does nothing. r t [] ->  ( ) -- Handles the Up8 key and triggers a redraw. _otherwise -> E -- Does not handle the event, so other handlers may be invoked.  Creates a uC to be displayed. May modify the App's state (e. g. for resizing).Like &, but does not return the final state."Runs runs the event loop until an ~ & is encountered. Events handled with ~ ( action) will shut down vA, run the action (e. g. invoking an external editor), and start v again.wMonomorphic version of /, to avoid having to update pipes-concurrency.xUWe need the display region in order to initialize the app, which in turn will start v6. To resolve this circular dependency, we start once vO in order to determine the display region, and shut it down again immediately.Opens devtty' read-only. Should be connected to the stdin of a GUI process (e. g. v).Opens devtty( write-only. Should be connected to the stdout of a GUI process (e. g. v).nopwxyz{ nopwxyz{| !"#$%&'(')'*'+'+','-'-../0123456789:;<=>?@AABCDEFGHIJKLMMNOPPQRSSTUVWXYZ[\]^_`_abcdefghijklmnopqrstuv w w x y z { | } ~ ~                    !"#$%&'()(*(+(,(-(.(/(0(0(123232456575859:;:<=>?@ABCDEFGHIJHIKHILMNOMNP Q R STUTVWXYWXZWX[WX\]^]_`aWXbWXc!"dWXe!fg!fg!fh!fi!fj!fk!fl!fm!fn!fo!fp!fq!frstWuvWuwWuxHyz{|}~HHHHHH$vgrep-0.1.4.1-BFUIWq6PqNT2xZRAIzYfuE%Vgrep.Widget.HorizontalSplit.Internal Vgrep.TypePipes.Concurrent.PQueueVgrep.Widget.Pager.Internal Vgrep.ResultsVgrep.Widget.Results.Internal Vgrep.ParserVgrep.System.GrepVgrep.Environment.ConfigVgrep.Environment Vgrep.Event Vgrep.TextControl.Monad.State.ExtendedVgrep.Widget.TypeVgrep.Widget.HorizontalSplitVgrep.Widget.PagerVgrep.Widget.ResultsControl.Concurrent.STM.TPQueue Vgrep.AppVgrepTApp Vgrep.WidgetWidget Vgepr.AppPipes.Concurrentspawn' UnboundedData.Functor.Contravariant contramapbaseGHC.Real%transformers-0.5.2.0Control.Monad.Trans.Classlift#mmorph-1.0.6-I6fWQohILlqH1gvA6UibXUControl.Monad.Morphhoist-pipes-concurrency-2.0.6-FnE7mKEPgUBF42S6l7wzA fromInputtoOutputrecvInputsendOutputPager_column _highlighted_above_visible $fEqPager $fShowPagerabovecolumn highlightedvisiblepositionLayoutLeftOnly RightOnlySplitFocus FocusLeft FocusRightHSplit _leftWidget _rightWidget_layout $fEqFocus $fEqLayoutlayout leftWidget rightWidget currentWidgetleftWidgetFocusedrightWidgetFocusedFileLineReferencegetFilegetLineReference LineReference getLineNumber getLineTextFile getFileName$fEqFile $fShowFile$fEqLineReference$fShowLineReference$fEqFileLineReference$fShowFileLineReference DisplayLine FileHeaderLine SelectedLineResults EmptyResultsfeedshowNextshowPrevhideNexthidePrevmoveDownmoveUpresizetoLines lineNumbercurrentFileNamecurrentLineNumbercurrentFileResultLineNumbers $fEqResults $fShowResults$fEqDisplayLineparseGrepOutput parseLine grepForAppgrep recursiveGrep grepVersionColors _lineNumbers_lineNumbersHl_normal _normalHl _fileHeaders _selectedConfig_colors_tabstop_editor $fEqColors $fShowColors $fEqConfig $fShowConfigcolorseditortabstop fileHeaders lineNumbers lineNumbersHlnormalnormalHlselected defaultConfigwithConfiguredEditor EnvironmentEnv_config_region$fEqEnvironment$fShowEnvironmentconfigregion InterruptSuspendHaltRedraw UnchangedNextSkipContinuedispatch dispatchMap$fMonoidRedraw $fFunctorNext $fMonoidNextexpandForDisplayexpandLineForDisplay liftStatewhenSunlessSVgrepmkVgrepT runVgrepT vgrepBracketmodifyEnvironment$fZoomVgrepTVgrepTst$fMFunctorVgrepT$fMonadTransVgrepT$fMonadStatesVgrepT$fMonadReaderEnvironmentVgrepT$fFunctorVgrepT$fApplicativeVgrepT $fMonadVgrepT$fMonadIOVgrepT initializedrawhandle HSplitWidget hSplitWidgetleftOnly rightOnly splitView switchFocus PagerWidget pagerWidgetreplaceBufferContents moveToLinescroll scrollPagehScroll ResultsWidget resultsWidget feedResultpageUppageDownprevLinenextLineresizeToWindowTPQueue newTPQueue newTPQueueIO writeTPQueue readTPQueuetryReadTPQueue peekTPQueuetryPeekTPQueueisEmptyTPQueuespawn withSpawn liftEvent handleEventrenderrunApp_runAppttyInttyOut$fEqEventPriority$fOrdEventPriority$fEnumEventPriorityreverseGHC.BaseNothingJust visibleHeightcurrent bufferToList#text-1.2.2.1-9Yh8rJoh8fO2JMLWffT3QsData.Text.InternalText lineParsergrepWithFileAndLineNumbergrepPipe recursive withFileNamewithLineNumberskipBinaryFiles lineBufferedversioncreateGrepProcessstreamResultsFromtextFromHandle textToHandlepeek Control.MonadguardjoinMonad>>=>>returnfailFunctorfmap<$ Applicativepure<*>*><*Data.TraversablemapMsequenceliftM Alternativemanyemptysome MonadPlusmzeromplusmfilter<$!>unless replicateM_ replicateMfoldM_foldM zipWithM_zipWithM mapAndUnzipMforever<=<>=>filterMforMControl.Applicativeoptional WrappedMonad WrapMonad unwrapMonad WrappedArrow WrapArrow unwrapArrowZipList getZipListData.Functor.ConstConstgetConst Data.Foldablemsum sequence_forM_mapM_ Data.Functorvoid<$>apliftM5liftM4liftM3liftM2when=<<liftA3liftA2liftA<**>vty-5.12-E86dGJfOW8H3YwJkNvUZdRGraphics.Vty.Prelude regionHeight regionWidth DisplayRegioncontainers-0.5.7.1 Data.Map.BasefromListMap expandText expandTabsexpandSpecialCharsControl.Monad.FixMonadFixmfix mtl-2.2.1-6qsR1PHUy5lL47Hpoa4jCMControl.Monad.State.Class MonadStategetstateputControl.Monad.IO.ClassMonadIOliftIO Data.Functionfixgetsmodify MonadTransmodify' Control.Monad.Trans.State.StrictStateT runStateTStaterunState evalState execStatemapState withState evalStateT execStateT mapStateT withStateTControl.Exception.BasebracketControl.Monad.Reader.Classlocal MonadReaderaskGraphics.Vty.Image.InternalImage initHSplit drawWidgetsrunInLeftWidgetrunInRightWidget handleEventshSplitKeyBindingsLefthSplitKeyBindingsRight initPagerpagerKeyBindings setPosition renderPager initResultsresultsKeyBindings repeatedly tryPrevLine tryNextLine maybeModifyrenderResultList renderLine GHC.Conc.Sync atomicallyghc-prim GHC.TypesTrue mkTPQueue"stm-2.4.4.1-4z2NRWnB0NIIUvSJsHW0kFControl.Concurrent.STM.TQueueTQueue EventPriorityUserSystemGraphics.Vty.Input.EventsEventEvKeyKEnterKUpGraphics.Vty.PicturePicture Graphics.VtyVtydisplayRegionHack appEventLoopwithVtyinitVty