MCPcopy Index your code
hub / github.com/Effect-TS/effect / best

Function best

packages/printer/src/internal/layout.ts:48–133  ·  view source on GitHub ↗
(
    self: InternalPipeline.LayoutPipeline<A>,
    nl: number,
    cc: number
  )

Source from the content-addressed store, hash-verified

46 options: Layout.Layout.Options
47): Effect.Effect<DocStream.DocStream<A>> => {
48 const best = (
49 self: InternalPipeline.LayoutPipeline<A>,
50 nl: number,
51 cc: number
52 ): Effect.Effect<DocStream.DocStream<A>> =>
53 Effect.gen(function*() {
54 switch (self._tag) {
55 case "Nil": {
56 return InternalDocStream.empty
57 }
58 case "Cons": {
59 switch (self.document._tag) {
60 case "Fail": {
61 return InternalDocStream.failed
62 }
63 case "Empty": {
64 return yield* best(self.pipeline, nl, cc)
65 }
66 case "Char": {
67 const stream = yield* best(self.pipeline, nl, cc + 1)
68 return InternalDocStream.char(stream, self.document.char)
69 }
70 case "Text": {
71 const length = self.document.text.length
72 const stream = yield* best(self.pipeline, nl, cc + length)
73 return InternalDocStream.text(stream, self.document.text)
74 }
75 case "Line": {
76 const stream = yield* best(self.pipeline, self.indent, self.indent)
77 // Do not produce indentation if there is no subsequent text on
78 // the same line (prevents trailing whitespace)
79 const nextIndent = InternalDocStream.isEmptyStream(stream) || InternalDocStream.isLineStream(stream)
80 ? 0
81 : self.indent
82 return InternalDocStream.line(stream, nextIndent)
83 }
84 case "FlatAlt": {
85 const next = InternalPipeline.cons(self.indent, self.document.left, self.pipeline)
86 return yield* best(next, nl, cc)
87 }
88 case "Cat": {
89 const inner = InternalPipeline.cons(self.indent, self.document.right, self.pipeline)
90 const outer = InternalPipeline.cons(self.indent, self.document.left, inner)
91 return yield* best(outer, nl, cc)
92 }
93 case "Nest": {
94 const indent = self.indent + self.document.indent
95 const next = InternalPipeline.cons(indent, self.document.doc, self.pipeline)
96 return yield* best(next, nl, cc)
97 }
98 case "Union": {
99 const leftPipeline = InternalPipeline.cons(self.indent, self.document.left, self.pipeline)
100 const rightPipeline = InternalPipeline.cons(self.indent, self.document.right, self.pipeline)
101 const left = best(leftPipeline, nl, cc)
102 const right = best(rightPipeline, nl, cc)
103 return selectNicer(fits, nl, cc, left, right)
104 }
105 case "Column": {

Callers 1

wadlerLeijenSafeFunction · 0.85

Calls 2

selectNicerFunction · 0.85
textMethod · 0.45

Tested by

no test coverage detected