prettyprinter-configurable-1.30.0.0: Configurable pretty-printing
Safe HaskellSafe-Inferred
LanguageHaskell2010

Text.Fixity

Description

Machinery for deciding whether an expression needs to be wrapped in parentheses or not.

Synopsis

Documentation

type Precedence = Double Source #

Fractional precedence, so that it's always possible to squeeze an operator precedence between two existing precedences. Ranges over [-20, 120]. A normal operator should have a precedence within [0, 100). It might be useful to have a negative precedence if you're trying to model some already existing system, for example in Haskell ($) has precedence 0, but clearly if b then y else f $ x should be rendered without any parens, hence the precedence of if_then_else_ is less than 0, i.e. negative.

The precedence of juxtaposition is 100. Normally you want juxtaposition to have the highest precedence, but some languages have operators that bind tighter than juxtaposition, e.g. Haskell's postfix _{_}: f z { x = y } means f (z {x = y}).

data Associativity Source #

Associativity of an operator.

Instances

Instances details
Show Associativity Source # 
Instance details

Defined in Text.Fixity.Internal

Eq Associativity Source # 
Instance details

Defined in Text.Fixity.Internal

data FixityOver prec Source #

Fixity of an operator.

We allow unary operators to have associativity, because it's useful to distinguish between an expression like -(-x) (unary minus, left-associative) and ~~b (boolean NOT, right-associative).

Associativity of unary operators also matters when pretty-printing expressions like (-x) + y, which is pretty-printed as -x + y, assuming unary minus has the same fixity as + (and both the operators are left-associative). I.e. unary minus is handled just like the binary one: (0 - x) + y is pretty-printed as 0 - x + y.

Postfix operators are handled similarly. E.g. if ! is left-associative, then (x!)! is pretty-printed as x!! and if it's right-associative -- (x!)!.

The data type is parameterized, so that the user can choose precedence to be integer/fractional, bounded/unbounded, etc (we could also allows operators to be partially or totally ordered, but at the moment prec is required to implement Ord, i.e. it has to be totally ordered). By default we go with bounded fractional precedence, see the main Text.Fixity module.

Constructors

Fixity 

Instances

Instances details
Show prec ⇒ Show (FixityOver prec) Source # 
Instance details

Defined in Text.Fixity.Internal

Methods

showsPrecIntFixityOver prec → ShowS Source #

showFixityOver prec → String Source #

showList ∷ [FixityOver prec] → ShowS Source #

Eq prec ⇒ Eq (FixityOver prec) Source # 
Instance details

Defined in Text.Fixity.Internal

Methods

(==)FixityOver prec → FixityOver prec → Bool Source #

(/=)FixityOver prec → FixityOver prec → Bool Source #

data Direction Source #

Direction in which pretty-printing goes. For example in x + y x is pretty-printed to the left of + and y is pretty-printed to the right of +.

Constructors

ToTheLeft 
ToTheRight 

Instances

Instances details
Show Direction Source # 
Instance details

Defined in Text.Fixity.Internal

Eq Direction Source # 
Instance details

Defined in Text.Fixity.Internal

data RenderContextOver prec Source #

A context that an expression is being rendered in.

Instances

Instances details
HasRenderContext RenderContext Source # 
Instance details

Defined in Text.PrettyBy.Fixity

Show prec ⇒ Show (RenderContextOver prec) Source # 
Instance details

Defined in Text.Fixity.Internal

Eq prec ⇒ Eq (RenderContextOver prec) Source # 
Instance details

Defined in Text.Fixity.Internal

encloseIn Source #

Arguments

Ord prec 
⇒ (a → a)

Enclose a value of type a in parens.

RenderContextOver prec

An outer context.

FixityOver prec

An inner fixity.

→ a 
→ a 

Enclose an a (using the provided function) if required or leave it as is. The need for enclosing is determined from an outer RenderContext and the inner fixity.

botFixityFixity Source #

A fixity with the lowest precedence. When used as a part of an outer context, never causes addition of parens.

juxtFixityFixity Source #

The fixity of juxtaposition.

unitFixityFixity Source #

The fixity of a unitary expression which is safe to render without parens in any context.

topFixityFixity Source #

A fixity with the highest precedence. When used as a part of an outer context, always causes addition of parens.

botRenderContextRenderContext Source #

An initial RenderContext. An expression printed in this context never gets enclosed in parens.

topRenderContextRenderContext Source #

An initial RenderContext. An expression printed in this context always gets enclosed in parens.