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

Function wadlerLeijenSafe

packages/printer/src/internal/layout.ts:41–135  ·  view source on GitHub ↗
(
  self: InternalPipeline.LayoutPipeline<A>,
  nestingLevel: number,
  currentColumn: number,
  fits: Layout.Layout.FittingPredicate<A>,
  options: Layout.Layout.Options
)

Source from the content-addressed store, hash-verified

39)
40
41const wadlerLeijenSafe = <A>(
42 self: InternalPipeline.LayoutPipeline<A>,
43 nestingLevel: number,
44 currentColumn: number,
45 fits: Layout.Layout.FittingPredicate<A>,
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": {

Callers 1

layout.tsFile · 0.85

Calls 1

bestFunction · 0.85

Tested by

no test coverage detected