Skip to content

Instantly share code, notes, and snippets.

@olafurpg
Created April 9, 2017 19:17
Show Gist options
  • Save olafurpg/44ee2d0a8c5b8330702cf00d23d0978a to your computer and use it in GitHub Desktop.
Save olafurpg/44ee2d0a8c5b8330702cf00d23d0978a to your computer and use it in GitHub Desktop.
Source(
Seq(
Pkg(
Term.Select(
Term.Select(Term.Select(Term.Name("com"), Term.Name("github")), Term.Name("johnynek")),
Term.Name("paiges")),
Seq(
Import(
Seq(
Importer(
Term.Select(Term.Name("java"), Term.Name("io")),
Seq(Importee.Name(Name.Indeterminate("PrintWriter")))))),
Import(
Seq(
Importer(
Term.Select(Term.Name("java"), Term.Name("lang")),
Seq(Importee.Name(Name.Indeterminate("StringBuilder")))))),
Import(
Seq(
Importer(
Term.Select(Term.Name("scala"), Term.Name("annotation")),
Seq(Importee.Name(Name.Indeterminate("tailrec")))))),
Import(
Seq(
Importer(
Term.Select(
Term.Select(Term.Name("scala"), Term.Name("util")), Term.Name("matching")),
Seq(Importee.Name(Name.Indeterminate("Regex")))))),
Defn.Class(
Seq(Mod.Sealed(), Mod.Abstract()), Type.Name("Doc"), Nil,
Ctor.Primary(Nil, Ctor.Ref.Name("this"), Nil),
Template(
Nil, Seq(Ctor.Ref.Name("Product"), Ctor.Ref.Name("Serializable")),
Term.Param(Nil, Name.Anonymous(), None, None),
Some(
Seq(
Import(
Seq(
Importer(
Term.Name("Doc"),
Seq(
Importee.Name(Name.Indeterminate("Empty")),
Importee.Name(Name.Indeterminate("Text")),
Importee.Name(Name.Indeterminate("Line")),
Importee.Name(Name.Indeterminate("Nest")),
Importee.Name(Name.Indeterminate("Concat")),
Importee.Name(Name.Indeterminate("Union")))))),
Defn.Def(
Nil, Term.Name("+"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("that"), Some(Type.Name("Doc")), None))),
Some(Type.Name("Doc")),
Term.Apply(
Term.Name("Concat"), Seq(Term.This(Name.Anonymous()), Term.Name("that")))),
Defn.Def(
Nil, Term.Name("+:"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("str"), Some(Type.Name("String")), None))),
Some(Type.Name("Doc")),
Term.ApplyInfix(
Term.Apply(
Term.Select(Term.Name("Doc"), Term.Name("text")), Seq(Term.Name("str"))),
Term.Name("+"), Nil, Seq(Term.This(Name.Anonymous())))),
Defn.Def(
Nil, Term.Name(":+"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("str"), Some(Type.Name("String")), None))),
Some(Type.Name("Doc")),
Term.ApplyInfix(
Term.This(Name.Anonymous()), Term.Name("+"), Nil,
Seq(
Term.Apply(
Term.Select(Term.Name("Doc"), Term.Name("text")), Seq(Term.Name("str")))))),
Defn.Def(
Nil, Term.Name("*"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("n"), Some(Type.Name("Int")), None))),
Some(Type.Name("Doc")), Term.Apply(Term.Name("repeat"), Seq(Term.Name("n")))),
Defn.Def(
Nil, Term.Name("/"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("that"), Some(Type.Name("Doc")), None))),
Some(Type.Name("Doc")),
Term.Apply(
Term.Name("Concat"),
Seq(
Term.This(Name.Anonymous()),
Term.Apply(
Term.Name("Concat"),
Seq(
Term.Select(Term.Name("Doc"), Term.Name("line")), Term.Name("that")))))),
Defn.Def(
Nil, Term.Name("line"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("that"), Some(Type.Name("Doc")), None))),
Some(Type.Name("Doc")),
Term.ApplyInfix(
Term.This(Name.Anonymous()), Term.Name("/"), Nil, Seq(Term.Name("that")))),
Defn.Def(
Nil, Term.Name("/:"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("str"), Some(Type.Name("String")), None))),
Some(Type.Name("Doc")),
Term.Apply(
Term.Name("Concat"),
Seq(
Term.Apply(
Term.Select(Term.Name("Doc"), Term.Name("text")), Seq(Term.Name("str"))),
Term.Apply(
Term.Name("Concat"),
Seq(
Term.Select(Term.Name("Doc"), Term.Name("line")),
Term.This(Name.Anonymous())))))),
Defn.Def(
Nil, Term.Name(":/"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("str"), Some(Type.Name("String")), None))),
Some(Type.Name("Doc")),
Term.ApplyInfix(
Term.This(Name.Anonymous()), Term.Name("/"), Nil,
Seq(
Term.Apply(
Term.Select(Term.Name("Doc"), Term.Name("text")), Seq(Term.Name("str")))))),
Defn.Def(
Nil, Term.Name("line"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("str"), Some(Type.Name("String")), None))),
Some(Type.Name("Doc")),
Term.ApplyInfix(
Term.This(Name.Anonymous()), Term.Name(":/"), Nil, Seq(Term.Name("str")))),
Defn.Def(
Nil, Term.Name("space"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("that"), Some(Type.Name("Doc")), None))),
Some(Type.Name("Doc")),
Term.Apply(
Term.Name("Concat"),
Seq(
Term.This(Name.Anonymous()),
Term.Apply(
Term.Name("Concat"),
Seq(
Term.Select(Term.Name("Doc"), Term.Name("space")), Term.Name("that")))))),
Defn.Def(
Nil, Term.Name("space"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("that"), Some(Type.Name("String")), None))),
Some(Type.Name("Doc")),
Term.Apply(
Term.Select(Term.This(Name.Anonymous()), Term.Name("space")),
Seq(
Term.Apply(
Term.Select(Term.Name("Doc"), Term.Name("text")),
Seq(Term.Name("that")))))),
Defn.Def(
Nil, Term.Name("spaceOrLine"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("that"), Some(Type.Name("Doc")), None))),
Some(Type.Name("Doc")),
Term.Apply(
Term.Name("Concat"),
Seq(
Term.This(Name.Anonymous()),
Term.Apply(
Term.Name("Concat"),
Seq(
Term.Select(Term.Name("Doc"), Term.Name("spaceOrLine")),
Term.Name("that")))))),
Defn.Def(
Nil, Term.Name("spaceOrLine"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("that"), Some(Type.Name("String")), None))),
Some(Type.Name("Doc")),
Term.Apply(
Term.Name("spaceOrLine"),
Seq(
Term.Apply(
Term.Select(Term.Name("Doc"), Term.Name("text")),
Seq(Term.Name("that")))))),
Defn.Def(
Nil, Term.Name("bracketBy"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("left"), Some(Type.Name("Doc")), None),
Term.Param(Nil, Term.Name("right"), Some(Type.Name("Doc")), None),
Term.Param(Nil, Term.Name("indent"), Some(Type.Name("Int")), Some(Lit(2))))),
Some(Type.Name("Doc")),
Term.Apply(
Term.Name("Concat"),
Seq(
Term.Name("left"),
Term.Select(
Term.Apply(
Term.Name("Concat"),
Seq(
Term.Apply(
Term.Select(
Term.Apply(
Term.Name("Concat"),
Seq(
Term.Select(Term.Name("Doc"), Term.Name("line")),
Term.This(Name.Anonymous()))),
Term.Name("nest")),
Seq(Term.Name("indent"))),
Term.Apply(
Term.Name("Concat"),
Seq(
Term.Select(Term.Name("Doc"), Term.Name("empty")),
Term.Name("right"))))),
Term.Name("grouped"))))),
Defn.Def(
Nil, Term.Name("grouped"), Nil, Nil, Some(Type.Name("Doc")),
Term.Match(
Term.Name("flattenOption"),
Seq(
Case(
Pat.Extract(Term.Name("Some"), Nil, Seq(Pat.Var.Term(Term.Name("flat")))),
None,
Term.Apply(
Term.Name("Union"),
Seq(Term.Name("flat"), Term.Function(Nil, Term.This(Name.Anonymous()))))),
Case(Term.Name("None"), None, Term.This(Name.Anonymous()))))),
Defn.Def(
Nil, Term.Name("isEmpty"), Nil, Nil, Some(Type.Name("Boolean")),
Term.Block(
Seq(
Defn.Def(
Seq(Mod.Annot(Ctor.Ref.Name("tailrec"))), Term.Name("loop"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("doc"), Some(Type.Name("Doc")), None),
Term.Param(
Nil, Term.Name("stack"),
Some(Type.Apply(Type.Name("List"), Seq(Type.Name("Doc")))), None))),
Some(Type.Name("Boolean")),
Term.Match(
Term.Name("doc"),
Seq(
Case(
Term.Name("Empty"), None,
Term.Match(
Term.Name("stack"),
Seq(
Case(
Pat.ExtractInfix(
Pat.Var.Term(Term.Name("d1")), Term.Name("::"),
Seq(Pat.Var.Term(Term.Name("tail")))),
None,
Term.Apply(
Term.Name("loop"), Seq(Term.Name("d1"), Term.Name("tail")))),
Case(Term.Name("Nil"), None, Lit(true))))),
Case(
Pat.Extract(
Term.Name("Concat"), Nil, Seq(Pat.Wildcard(), Term.Name("Line"))),
None, Lit(false)),
Case(
Pat.Extract(
Term.Name("Concat"), Nil,
Seq(
Pat.Var.Term(Term.Name("a")),
Pat.Extract(
Term.Name("Text"), Nil, Seq(Pat.Var.Term(Term.Name("s")))))),
None,
Term.ApplyInfix(
Term.Select(Term.Name("s"), Term.Name("isEmpty")), Term.Name("&&"),
Nil,
Seq(
Term.Apply(
Term.Name("loop"), Seq(Term.Name("a"), Term.Name("stack")))))),
Case(
Pat.Extract(
Term.Name("Concat"), Nil,
Seq(Pat.Var.Term(Term.Name("a")), Pat.Var.Term(Term.Name("b")))),
None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.Name("a"),
Term.ApplyInfix(
Term.Name("b"), Term.Name("::"), Nil,
Seq(Term.Name("stack")))))),
Case(
Pat.Extract(
Term.Name("Nest"), Nil,
Seq(Pat.Var.Term(Term.Name("i")), Pat.Var.Term(Term.Name("d")))),
None,
Term.Apply(
Term.Name("loop"), Seq(Term.Name("d"), Term.Name("stack")))),
Case(
Pat.Extract(
Term.Name("Text"), Nil, Seq(Pat.Var.Term(Term.Name("s")))),
None,
Term.ApplyInfix(
Term.Select(Term.Name("s"), Term.Name("isEmpty")), Term.Name("&&"),
Nil,
Seq(
Term.Apply(
Term.Name("loop"),
Seq(Term.Name("Empty"), Term.Name("stack")))))),
Case(Term.Name("Line"), None, Lit(false)),
Case(
Pat.Extract(
Term.Name("Union"), Nil,
Seq(Pat.Var.Term(Term.Name("flattened")), Pat.Wildcard())),
None,
Term.Apply(
Term.Name("loop"),
Seq(Term.Name("flattened"), Term.Name("stack"))))))),
Term.Apply(
Term.Name("loop"), Seq(Term.This(Name.Anonymous()), Term.Name("Nil")))))),
Defn.Def(
Nil, Term.Name("isSubDocOf"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("that"), Some(Type.Name("Doc")), None))),
Some(Type.Name("Boolean")),
Term.Apply(
Term.Select(Term.Name("DocTree"), Term.Name("isSubDoc")),
Seq(
Term.Apply(
Term.Select(Term.Name("DocTree"), Term.Name("toDocTree")),
Seq(Term.This(Name.Anonymous()))),
Term.Apply(
Term.Select(Term.Name("DocTree"), Term.Name("toDocTree")),
Seq(Term.Name("that")))))),
Defn.Def(
Nil, Term.Name("render"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("width"), Some(Type.Name("Int")), None))),
Some(Type.Name("String")),
Term.Block(
Seq(
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("bldr"))), None,
Term.New(
Template(
Nil, Seq(Ctor.Ref.Name("StringBuilder")),
Term.Param(Nil, Name.Anonymous(), None, None), None))),
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("it"))), None,
Term.Apply(
Term.Select(Term.Name("Chunk"), Term.Name("best")),
Seq(Term.Name("width"), Term.This(Name.Anonymous())))),
Term.While(
Term.Select(Term.Name("it"), Term.Name("hasNext")),
Term.Block(
Seq(
Term.Apply(
Term.Select(Term.Name("bldr"), Term.Name("append")),
Seq(Term.Select(Term.Name("it"), Term.Name("next"))))))),
Term.Select(Term.Name("bldr"), Term.Name("toString"))))),
Defn.Def(
Nil, Term.Name("renderStream"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("width"), Some(Type.Name("Int")), None))),
Some(Type.Apply(Type.Name("Stream"), Seq(Type.Name("String")))),
Term.If(
Term.ApplyInfix(Term.Name("width"), Term.Name("<="), Nil, Seq(Lit(0))),
Term.Name("renderTallStream"),
Term.Select(
Term.Apply(
Term.Select(Term.Name("Chunk"), Term.Name("best")),
Seq(Term.Name("width"), Term.This(Name.Anonymous()))),
Term.Name("toStream")))),
Defn.Def(
Nil, Term.Name("renderTallStream"), Nil, Nil,
Some(Type.Apply(Type.Name("Stream"), Seq(Type.Name("String")))),
Term.Apply(
Term.Name("renderFixedDirection"),
Seq(Term.Arg.Named(Term.Name("tall"), Lit(true))))),
Defn.Def(
Nil, Term.Name("renderWideStream"), Nil, Nil,
Some(Type.Apply(Type.Name("Stream"), Seq(Type.Name("String")))),
Term.Apply(
Term.Name("renderFixedDirection"),
Seq(Term.Arg.Named(Term.Name("tall"), Lit(false))))),
Defn.Def(
Seq(Mod.Private(Name.Anonymous())), Term.Name("renderFixedDirection"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("tall"), Some(Type.Name("Boolean")), None))),
Some(Type.Apply(Type.Name("Stream"), Seq(Type.Name("String")))),
Term.Block(
Seq(
Defn.Def(
Seq(Mod.Annot(Ctor.Ref.Name("tailrec"))), Term.Name("loop"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("pos"), Some(Type.Name("Int")), None),
Term.Param(
Nil, Term.Name("lst"),
Some(
Type.Apply(
Type.Name("List"),
Seq(Type.Tuple(Seq(Type.Name("Int"), Type.Name("Doc")))))),
None))),
Some(Type.Apply(Type.Name("Stream"), Seq(Type.Name("String")))),
Term.Match(
Term.Name("lst"),
Seq(
Case(
Term.Name("Nil"), None,
Term.Select(Term.Name("Stream"), Term.Name("empty"))),
Case(
Pat.ExtractInfix(
Pat.Tuple(Seq(Pat.Var.Term(Term.Name("i")), Term.Name("Empty"))),
Term.Name("::"), Seq(Pat.Var.Term(Term.Name("z")))),
None,
Term.Apply(Term.Name("loop"), Seq(Term.Name("pos"), Term.Name("z")))),
Case(
Pat.ExtractInfix(
Pat.Tuple(
Seq(
Pat.Var.Term(Term.Name("i")),
Pat.Extract(
Term.Name("Concat"), Nil,
Seq(
Pat.Var.Term(Term.Name("a")),
Pat.Var.Term(Term.Name("b")))))),
Term.Name("::"), Seq(Pat.Var.Term(Term.Name("z")))),
None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.Name("pos"),
Term.ApplyInfix(
Term.Tuple(Seq(Term.Name("i"), Term.Name("a"))),
Term.Name("::"), Nil,
Seq(
Term.ApplyInfix(
Term.Tuple(Seq(Term.Name("i"), Term.Name("b"))),
Term.Name("::"), Nil, Seq(Term.Name("z")))))))),
Case(
Pat.ExtractInfix(
Pat.Tuple(
Seq(
Pat.Var.Term(Term.Name("i")),
Pat.Extract(
Term.Name("Nest"), Nil,
Seq(
Pat.Var.Term(Term.Name("j")),
Pat.Var.Term(Term.Name("d")))))),
Term.Name("::"), Seq(Pat.Var.Term(Term.Name("z")))),
None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.Name("pos"),
Term.ApplyInfix(
Term.Tuple(
Seq(
Term.ApplyInfix(
Term.Name("i"), Term.Name("+"), Nil, Seq(Term.Name("j"))),
Term.Name("d"))),
Term.Name("::"), Nil, Seq(Term.Name("z")))))),
Case(
Pat.ExtractInfix(
Pat.Tuple(
Seq(
Pat.Var.Term(Term.Name("i")),
Pat.Extract(
Term.Name("Text"), Nil, Seq(Pat.Var.Term(Term.Name("s")))))),
Term.Name("::"), Seq(Pat.Var.Term(Term.Name("z")))),
None,
Term.ApplyInfix(
Term.Name("s"), Term.Name("#::"), Nil,
Seq(
Term.Apply(
Term.Name("cheat"),
Seq(
Term.ApplyInfix(
Term.Name("pos"), Term.Name("+"), Nil,
Seq(Term.Select(Term.Name("s"), Term.Name("length")))),
Term.Name("z")))))),
Case(
Pat.ExtractInfix(
Pat.Tuple(Seq(Pat.Var.Term(Term.Name("i")), Term.Name("Line"))),
Term.Name("::"), Seq(Pat.Var.Term(Term.Name("z")))),
None,
Term.ApplyInfix(
Term.Apply(
Term.Select(Term.Name("Chunk"), Term.Name("lineToStr")),
Seq(Term.Name("i"))),
Term.Name("#::"), Nil,
Seq(
Term.Apply(
Term.Name("cheat"), Seq(Term.Name("i"), Term.Name("z")))))),
Case(
Pat.ExtractInfix(
Pat.Tuple(
Seq(
Pat.Var.Term(Term.Name("i")),
Pat.Bind(
Pat.Var.Term(Term.Name("u")),
Pat.Extract(
Term.Name("Union"), Nil,
Seq(Pat.Var.Term(Term.Name("a")), Pat.Wildcard()))))),
Term.Name("::"), Seq(Pat.Var.Term(Term.Name("z")))),
None,
Term.Block(
Seq(
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("next"))), None,
Term.If(
Term.Name("tall"),
Term.Select(Term.Name("u"), Term.Name("bDoc")),
Term.Name("a"))),
Term.Apply(
Term.Name("loop"),
Seq(
Term.Name("pos"),
Term.ApplyInfix(
Term.Tuple(Seq(Term.Name("i"), Term.Name("next"))),
Term.Name("::"), Nil, Seq(Term.Name("z"))))))))))),
Defn.Def(
Nil, Term.Name("cheat"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("pos"), Some(Type.Name("Int")), None),
Term.Param(
Nil, Term.Name("lst"),
Some(
Type.Apply(
Type.Name("List"),
Seq(Type.Tuple(Seq(Type.Name("Int"), Type.Name("Doc")))))),
None))),
None,
Term.Apply(Term.Name("loop"), Seq(Term.Name("pos"), Term.Name("lst")))),
Term.Apply(
Term.Name("loop"),
Seq(
Lit(0),
Term.ApplyInfix(
Term.Tuple(Seq(Lit(0), Term.This(Name.Anonymous()))), Term.Name("::"),
Nil, Seq(Term.Name("Nil")))))))),
Defn.Def(
Nil, Term.Name("repeat"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("count"), Some(Type.Name("Int")), None))),
Some(Type.Name("Doc")),
Term.Block(
Seq(
Defn.Def(
Nil, Term.Name("loop"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("d"), Some(Type.Name("Doc")), None),
Term.Param(Nil, Term.Name("cnt"), Some(Type.Name("Int")), None))),
Some(Type.Name("Doc")),
Term.Block(
Seq(
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("n"))), None,
Term.ApplyInfix(Term.Name("cnt"), Term.Name(">>"), Nil, Seq(Lit(1)))),
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("dn2"))), None,
Term.If(
Term.ApplyInfix(Term.Name("n"), Term.Name(">"), Nil, Seq(Lit(0))),
Term.Block(
Seq(
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("dn"))), None,
Term.Apply(
Term.Name("loop"), Seq(Term.Name("d"), Term.Name("n")))),
Term.Apply(
Term.Name("Concat"), Seq(Term.Name("dn"), Term.Name("dn"))))),
Term.Block(Seq(Term.Name("Empty"))))),
Term.If(
Term.ApplyInfix(
Term.ApplyInfix(Term.Name("cnt"), Term.Name("&"), Nil, Seq(Lit(1))),
Term.Name("=="), Nil, Seq(Lit(1))),
Term.Apply(
Term.Name("Concat"), Seq(Term.Name("dn2"), Term.Name("d"))),
Term.Name("dn2"))))),
Term.If(
Term.ApplyInfix(Term.Name("count"), Term.Name("<="), Nil, Seq(Lit(0))),
Term.Name("Empty"),
Term.Apply(
Term.Name("loop"),
Seq(Term.This(Name.Anonymous()), Term.Name("count"))))))),
Defn.Def(
Nil, Term.Name("nest"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("amount"), Some(Type.Name("Int")), None))),
Some(Type.Name("Doc")),
Term.Match(
Term.This(Name.Anonymous()),
Seq(
Case(
Pat.Extract(
Term.Name("Nest"), Nil,
Seq(Pat.Var.Term(Term.Name("i")), Pat.Var.Term(Term.Name("d")))),
None,
Term.Apply(
Term.Name("Nest"),
Seq(
Term.ApplyInfix(
Term.Name("i"), Term.Name("+"), Nil, Seq(Term.Name("amount"))),
Term.Name("d")))),
Case(
Pat.Wildcard(), None,
Term.Apply(
Term.Name("Nest"),
Seq(Term.Name("amount"), Term.This(Name.Anonymous()))))))),
Defn.Def(
Nil, Term.Name("writeTo"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("width"), Some(Type.Name("Int")), None),
Term.Param(Nil, Term.Name("pw"), Some(Type.Name("PrintWriter")), None))),
Some(Type.Name("Unit")),
Term.Block(
Seq(
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("it"))), None,
Term.Apply(
Term.Select(Term.Name("Chunk"), Term.Name("best")),
Seq(Term.Name("width"), Term.This(Name.Anonymous())))),
Term.While(
Term.Select(Term.Name("it"), Term.Name("hasNext")),
Term.Block(
Seq(
Term.Apply(
Term.Select(Term.Name("pw"), Term.Name("append")),
Seq(Term.Select(Term.Name("it"), Term.Name("next")))))))))),
Defn.Val(
Seq(Mod.Override(), Mod.Lazy()), Seq(Pat.Var.Term(Term.Name("hashCode"))),
Some(Type.Name("Int")),
Term.Block(
Seq(
Defn.Def(
Seq(Mod.Annot(Ctor.Ref.Name("inline"))), Term.Name("hash"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("curr"), Some(Type.Name("Int")), None),
Term.Param(Nil, Term.Name("c"), Some(Type.Name("Char")), None))),
Some(Type.Name("Int")),
Term.ApplyInfix(
Term.ApplyInfix(
Term.Name("curr"), Term.Name("*"), Nil, Seq(Lit(1500450271))),
Term.Name("+"), Nil,
Seq(Term.Select(Term.Name("c"), Term.Name("toInt"))))),
Defn.Def(
Seq(Mod.Annot(Ctor.Ref.Name("tailrec"))), Term.Name("shash"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("n"), Some(Type.Name("Int")), None),
Term.Param(Nil, Term.Name("s"), Some(Type.Name("String")), None),
Term.Param(Nil, Term.Name("i"), Some(Type.Name("Int")), None))),
Some(Type.Name("Int")),
Term.If(
Term.ApplyInfix(
Term.Name("i"), Term.Name("<"), Nil,
Seq(Term.Select(Term.Name("s"), Term.Name("length")))),
Term.Apply(
Term.Name("shash"),
Seq(
Term.Apply(
Term.Name("hash"),
Seq(
Term.Name("n"),
Term.Apply(
Term.Select(Term.Name("s"), Term.Name("charAt")),
Seq(Term.Name("i"))))),
Term.Name("s"),
Term.ApplyInfix(Term.Name("i"), Term.Name("+"), Nil, Seq(Lit(1))))),
Term.Name("n"))),
Term.Apply(
Term.Apply(
Term.Select(Term.Name("renderWideStream"), Term.Name("foldLeft")),
Seq(Lit(0xdead60d5))),
Seq(
Term.PartialFunction(
Seq(
Case(
Pat.Tuple(
Seq(Pat.Var.Term(Term.Name("n")), Pat.Var.Term(Term.Name("s")))),
None,
Term.Apply(
Term.Name("shash"),
Seq(Term.Name("n"), Term.Name("s"), Lit(0))))))))))),
Defn.Def(
Seq(Mod.Override()), Term.Name("toString"), Nil, Nil, Some(Type.Name("String")),
Lit("Doc(...)")),
Defn.Def(
Nil, Term.Name("representation"), Nil,
Seq(
Seq(
Term.Param(
Nil, Term.Name("forceUnions"), Some(Type.Name("Boolean")),
Some(Lit(false))))),
Some(Type.Name("Doc")),
Term.Block(
Seq(
Defn.Def(
Seq(Mod.Annot(Ctor.Ref.Name("tailrec"))), Term.Name("loop"), Nil,
Seq(
Seq(
Term.Param(
Nil, Term.Name("stack"),
Some(
Type.Apply(
Type.Name("List"),
Seq(
Type.Apply(
Type.Name("Either"),
Seq(Type.Name("Doc"), Type.Name("String")))))),
None),
Term.Param(Nil, Term.Name("suffix"), Some(Type.Name("Doc")), None))),
Some(Type.Name("Doc")),
Term.Match(
Term.Name("stack"),
Seq(
Case(
Pat.ExtractInfix(
Pat.Var.Term(Term.Name("head")), Term.Name("::"),
Seq(Pat.Var.Term(Term.Name("tail")))),
None,
Term.Match(
Term.Name("head"),
Seq(
Case(
Pat.Extract(
Term.Name("Right"), Nil, Seq(Pat.Var.Term(Term.Name("s")))),
None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.Name("tail"),
Term.ApplyInfix(
Term.Name("s"), Term.Name("+:"), Nil,
Seq(Term.Name("suffix")))))),
Case(
Pat.Extract(
Term.Name("Left"), Nil, Seq(Pat.Var.Term(Term.Name("d")))),
None,
Term.Match(
Term.Name("d"),
Seq(
Case(
Term.Name("Empty"), None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.Name("tail"),
Term.ApplyInfix(
Lit("Empty"), Term.Name("+:"), Nil,
Seq(Term.Name("suffix")))))),
Case(
Term.Name("Line"), None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.Name("tail"),
Term.ApplyInfix(
Lit("Line"), Term.Name("+:"), Nil,
Seq(Term.Name("suffix")))))),
Case(
Pat.Extract(
Term.Name("Text"), Nil,
Seq(Pat.Var.Term(Term.Name("s")))),
None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.Name("tail"),
Term.ApplyInfix(
Lit("Text("), Term.Name("+:"), Nil,
Seq(
Term.ApplyInfix(
Term.Name("s"), Term.Name("+:"), Nil,
Seq(
Term.ApplyInfix(
Lit(")"), Term.Name("+:"), Nil,
Seq(Term.Name("suffix")))))))))),
Case(
Pat.Extract(
Term.Name("Nest"), Nil,
Seq(
Pat.Var.Term(Term.Name("i")),
Pat.Var.Term(Term.Name("d")))),
None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.ApplyInfix(
Term.Apply(Term.Name("Left"), Seq(Term.Name("d"))),
Term.Name("::"), Nil,
Seq(
Term.ApplyInfix(
Term.Apply(Term.Name("Right"), Seq(Lit(", "))),
Term.Name("::"), Nil,
Seq(
Term.ApplyInfix(
Term.Apply(
Term.Name("Right"),
Seq(
Term.Select(
Term.Name("i"),
Term.Name("toString")))),
Term.Name("::"), Nil,
Seq(
Term.ApplyInfix(
Term.Apply(
Term.Name("Right"),
Seq(Lit("Nest("))),
Term.Name("::"), Nil,
Seq(Term.Name("tail"))))))))),
Term.ApplyInfix(
Lit(")"), Term.Name("+:"), Nil,
Seq(Term.Name("suffix")))))),
Case(
Pat.Extract(
Term.Name("Concat"), Nil,
Seq(
Pat.Var.Term(Term.Name("x")),
Pat.Var.Term(Term.Name("y")))),
None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.ApplyInfix(
Term.Apply(Term.Name("Left"), Seq(Term.Name("y"))),
Term.Name("::"), Nil,
Seq(
Term.ApplyInfix(
Term.Apply(Term.Name("Right"), Seq(Lit(", "))),
Term.Name("::"), Nil,
Seq(
Term.ApplyInfix(
Term.Apply(
Term.Name("Left"), Seq(Term.Name("x"))),
Term.Name("::"), Nil,
Seq(
Term.ApplyInfix(
Term.Apply(
Term.Name("Right"),
Seq(Lit("Concat("))),
Term.Name("::"), Nil,
Seq(Term.Name("tail"))))))))),
Term.ApplyInfix(
Lit(")"), Term.Name("+:"), Nil,
Seq(Term.Name("suffix")))))),
Case(
Pat.Extract(
Term.Name("Union"), Nil,
Seq(
Pat.Var.Term(Term.Name("x")),
Pat.Var.Term(Term.Name("y")))),
None,
Term.If(
Term.Name("forceUnions"),
Term.Block(
Seq(
Term.Apply(
Term.Name("loop"),
Seq(
Term.ApplyInfix(
Term.Apply(
Term.Name("Left"),
Seq(Term.Apply(Term.Name("y"), Nil))),
Term.Name("::"), Nil,
Seq(
Term.ApplyInfix(
Term.Apply(
Term.Name("Right"), Seq(Lit(", "))),
Term.Name("::"), Nil,
Seq(
Term.ApplyInfix(
Term.Apply(
Term.Name("Left"),
Seq(Term.Name("x"))),
Term.Name("::"), Nil,
Seq(
Term.ApplyInfix(
Term.Apply(
Term.Name("Right"),
Seq(Lit("Union("))),
Term.Name("::"), Nil,
Seq(Term.Name("tail"))))))))),
Term.ApplyInfix(
Lit(")"), Term.Name("+:"), Nil,
Seq(Term.Name("suffix"))))))),
Term.Block(
Seq(
Term.Apply(
Term.Name("loop"),
Seq(
Term.ApplyInfix(
Term.Apply(
Term.Name("Left"), Seq(Term.Name("x"))),
Term.Name("::"), Nil,
Seq(
Term.ApplyInfix(
Term.Apply(
Term.Name("Right"), Seq(Lit("Union("))),
Term.Name("::"), Nil,
Seq(Term.Name("tail"))))),
Term.ApplyInfix(
Lit(", ...)"), Term.Name("+:"), Nil,
Seq(Term.Name("suffix"))))))))))))))),
Case(Term.Name("Nil"), None, Term.Name("suffix"))))),
Term.Apply(
Term.Name("loop"),
Seq(
Term.ApplyInfix(
Term.Apply(Term.Name("Left"), Seq(Term.This(Name.Anonymous()))),
Term.Name("::"), Nil, Seq(Term.Name("Nil"))),
Term.Select(Term.Name("Doc"), Term.Name("empty"))))))),
Defn.Def(
Nil, Term.Name("compare"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("that"), Some(Type.Name("Doc")), None))),
Some(Type.Name("Int")),
Term.Apply(
Term.Select(Term.Name("DocTree"), Term.Name("compareTree")),
Seq(
Term.Apply(
Term.Select(Term.Name("DocTree"), Term.Name("toDocTree")),
Seq(Term.This(Name.Anonymous()))),
Term.Apply(
Term.Select(Term.Name("DocTree"), Term.Name("toDocTree")),
Seq(Term.Name("that")))))),
Defn.Def(
Nil, Term.Name("flatten"), Nil, Nil, Some(Type.Name("Doc")),
Term.Block(
Seq(
Defn.Def(
Nil, Term.Name("finish"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("d"), Some(Type.Name("Doc")), None),
Term.Param(
Nil, Term.Name("front"),
Some(Type.Apply(Type.Name("List"), Seq(Type.Name("Doc")))), None))),
Some(Type.Name("Doc")),
Term.Apply(
Term.Apply(
Term.Select(Term.Name("front"), Term.Name("foldLeft")),
Seq(Term.Name("d"))),
Seq(
Term.Block(
Seq(
Term.Function(
Seq(
Term.Param(Nil, Term.Name("res"), None, None),
Term.Param(Nil, Term.Name("f"), None, None)),
Term.Block(
Seq(
Term.Apply(
Term.Name("Concat"),
Seq(Term.Name("f"), Term.Name("res"))))))))))),
Defn.Def(
Seq(Mod.Annot(Ctor.Ref.Name("tailrec"))), Term.Name("loop"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("h"), Some(Type.Name("Doc")), None),
Term.Param(
Nil, Term.Name("stack"),
Some(Type.Apply(Type.Name("List"), Seq(Type.Name("Doc")))), None),
Term.Param(
Nil, Term.Name("front"),
Some(Type.Apply(Type.Name("List"), Seq(Type.Name("Doc")))), None))),
Some(Type.Name("Doc")),
Term.Match(
Term.Name("h"),
Seq(
Case(
Pat.Alternative(
Term.Name("Empty"),
Pat.Extract(Term.Name("Text"), Nil, Seq(Pat.Wildcard()))),
None,
Term.Match(
Term.Name("stack"),
Seq(
Case(
Term.Name("Nil"), None,
Term.Apply(
Term.Name("finish"),
Seq(Term.Name("h"), Term.Name("front")))),
Case(
Pat.ExtractInfix(
Pat.Var.Term(Term.Name("x")), Term.Name("::"),
Seq(Pat.Var.Term(Term.Name("xs")))),
None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.Name("x"), Term.Name("xs"),
Term.ApplyInfix(
Term.Name("h"), Term.Name("::"), Nil,
Seq(Term.Name("front"))))))))),
Case(
Term.Name("Line"), None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.Select(Term.Name("Doc"), Term.Name("space")),
Term.Name("stack"), Term.Name("front")))),
Case(
Pat.Extract(
Term.Name("Nest"), Nil,
Seq(Pat.Var.Term(Term.Name("i")), Pat.Var.Term(Term.Name("d")))),
None,
Term.Apply(
Term.Name("loop"),
Seq(Term.Name("d"), Term.Name("stack"), Term.Name("front")))),
Case(
Pat.Extract(
Term.Name("Union"), Nil,
Seq(Pat.Var.Term(Term.Name("a")), Pat.Wildcard())),
None,
Term.Apply(
Term.Name("loop"),
Seq(Term.Name("a"), Term.Name("stack"), Term.Name("front")))),
Case(
Pat.Extract(
Term.Name("Concat"), Nil,
Seq(Pat.Var.Term(Term.Name("a")), Pat.Var.Term(Term.Name("b")))),
None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.Name("a"),
Term.ApplyInfix(
Term.Name("b"), Term.Name("::"), Nil, Seq(Term.Name("stack"))),
Term.Name("front"))))))),
Term.Apply(
Term.Name("loop"),
Seq(Term.This(Name.Anonymous()), Term.Name("Nil"), Term.Name("Nil")))))),
Defn.Def(
Nil, Term.Name("flattenOption"), Nil, Nil,
Some(Type.Apply(Type.Name("Option"), Seq(Type.Name("Doc")))),
Term.Block(
Seq(
Defn.Type(
Nil, Type.Name("DB"), Nil,
Type.Tuple(Seq(Type.Name("Doc"), Type.Name("Boolean")))),
Defn.Def(
Nil, Term.Name("finish"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("last"), Some(Type.Name("DB")), None),
Term.Param(
Nil, Term.Name("front"),
Some(Type.Apply(Type.Name("List"), Seq(Type.Name("DB")))), None))),
Some(Type.Apply(Type.Name("Option"), Seq(Type.Name("Doc")))),
Term.Block(
Seq(
Defn.Val(
Nil,
Seq(
Pat.Tuple(
Seq(Pat.Var.Term(Term.Name("d")), Pat.Var.Term(Term.Name("c"))))),
None,
Term.Apply(
Term.Apply(
Term.Select(Term.Name("front"), Term.Name("foldLeft")),
Seq(Term.Name("last"))),
Seq(
Term.PartialFunction(
Seq(
Case(
Pat.Tuple(
Seq(
Pat.Tuple(
Seq(
Pat.Var.Term(Term.Name("d1")),
Pat.Var.Term(Term.Name("c1")))),
Pat.Tuple(
Seq(
Pat.Var.Term(Term.Name("d0")),
Pat.Var.Term(Term.Name("c2")))))),
None,
Term.Tuple(
Seq(
Term.Apply(
Term.Name("Concat"),
Seq(Term.Name("d0"), Term.Name("d1"))),
Term.ApplyInfix(
Term.Name("c1"), Term.Name("||"), Nil,
Seq(Term.Name("c2"))))))))))),
Term.If(
Term.Name("c"), Term.Apply(Term.Name("Some"), Seq(Term.Name("d"))),
Term.Name("None"))))),
Defn.Def(
Seq(Mod.Annot(Ctor.Ref.Name("tailrec"))), Term.Name("loop"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("h"), Some(Type.Name("DB")), None),
Term.Param(
Nil, Term.Name("stack"),
Some(Type.Apply(Type.Name("List"), Seq(Type.Name("DB")))), None),
Term.Param(
Nil, Term.Name("front"),
Some(Type.Apply(Type.Name("List"), Seq(Type.Name("DB")))), None))),
Some(Type.Apply(Type.Name("Option"), Seq(Type.Name("Doc")))),
Term.Match(
Term.Select(Term.Name("h"), Term.Name("_1")),
Seq(
Case(
Pat.Alternative(
Term.Name("Empty"),
Pat.Extract(Term.Name("Text"), Nil, Seq(Pat.Wildcard()))),
None,
Term.Block(
Seq(
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("noChange"))), None,
Term.Name("h")),
Term.Match(
Term.Name("stack"),
Seq(
Case(
Term.Name("Nil"), None,
Term.Apply(
Term.Name("finish"),
Seq(Term.Name("h"), Term.Name("front")))),
Case(
Pat.ExtractInfix(
Pat.Var.Term(Term.Name("x")), Term.Name("::"),
Seq(Pat.Var.Term(Term.Name("xs")))),
None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.Name("x"), Term.Name("xs"),
Term.ApplyInfix(
Term.Name("h"), Term.Name("::"), Nil,
Seq(Term.Name("front"))))))))))),
Case(
Term.Name("Line"), None,
Term.Block(
Seq(
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("next"))), None,
Term.Select(Term.Name("Doc"), Term.Name("empty"))),
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("change"))), None,
Term.Tuple(Seq(Term.Name("next"), Lit(true)))),
Term.Match(
Term.Name("stack"),
Seq(
Case(
Term.Name("Nil"), None,
Term.Apply(
Term.Name("finish"),
Seq(Term.Name("change"), Term.Name("front")))),
Case(
Pat.ExtractInfix(
Pat.Var.Term(Term.Name("x")), Term.Name("::"),
Seq(Pat.Var.Term(Term.Name("xs")))),
None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.Name("x"), Term.Name("xs"),
Term.ApplyInfix(
Term.Name("change"), Term.Name("::"), Nil,
Seq(Term.Name("front"))))))))))),
Case(
Pat.Extract(
Term.Name("Nest"), Nil,
Seq(Pat.Var.Term(Term.Name("i")), Pat.Var.Term(Term.Name("d")))),
None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.Tuple(
Seq(
Term.Name("d"),
Term.Select(Term.Name("h"), Term.Name("_2")))),
Term.Name("stack"), Term.Name("front")))),
Case(
Pat.Extract(
Term.Name("Union"), Nil,
Seq(Pat.Var.Term(Term.Name("a")), Pat.Wildcard())),
None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.Tuple(Seq(Term.Name("a"), Lit(true))), Term.Name("stack"),
Term.Name("front")))),
Case(
Pat.Extract(
Term.Name("Concat"), Nil,
Seq(Pat.Var.Term(Term.Name("a")), Pat.Var.Term(Term.Name("b")))),
None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.Tuple(
Seq(
Term.Name("a"),
Term.Select(Term.Name("h"), Term.Name("_2")))),
Term.ApplyInfix(
Term.Tuple(
Seq(
Term.Name("b"),
Term.Select(Term.Name("h"), Term.Name("_2")))),
Term.Name("::"), Nil, Seq(Term.Name("stack"))),
Term.Name("front"))))))),
Term.Apply(
Term.Name("loop"),
Seq(
Term.Tuple(Seq(Term.This(Name.Anonymous()), Lit(false))),
Term.Name("Nil"), Term.Name("Nil")))))),
Defn.Def(
Nil, Term.Name("maxWidth"), Nil, Nil, Some(Type.Name("Int")),
Term.Block(
Seq(
Defn.Def(
Seq(Mod.Annot(Ctor.Ref.Name("tailrec"))), Term.Name("loop"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("pos"), Some(Type.Name("Int")), None),
Term.Param(
Nil, Term.Name("lst"),
Some(
Type.Apply(
Type.Name("List"),
Seq(Type.Tuple(Seq(Type.Name("Int"), Type.Name("Doc")))))),
None),
Term.Param(Nil, Term.Name("max"), Some(Type.Name("Int")), None))),
Some(Type.Name("Int")),
Term.Match(
Term.Name("lst"),
Seq(
Case(
Term.Name("Nil"), None,
Term.Apply(
Term.Select(Term.Name("math"), Term.Name("max")),
Seq(Term.Name("max"), Term.Name("pos")))),
Case(
Pat.ExtractInfix(
Pat.Tuple(Seq(Pat.Var.Term(Term.Name("i")), Term.Name("Empty"))),
Term.Name("::"), Seq(Pat.Var.Term(Term.Name("z")))),
None,
Term.Apply(
Term.Name("loop"),
Seq(Term.Name("pos"), Term.Name("z"), Term.Name("max")))),
Case(
Pat.ExtractInfix(
Pat.Tuple(
Seq(
Pat.Var.Term(Term.Name("i")),
Pat.Extract(
Term.Name("Concat"), Nil,
Seq(
Pat.Var.Term(Term.Name("a")),
Pat.Var.Term(Term.Name("b")))))),
Term.Name("::"), Seq(Pat.Var.Term(Term.Name("z")))),
None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.Name("pos"),
Term.ApplyInfix(
Term.Tuple(Seq(Term.Name("i"), Term.Name("a"))),
Term.Name("::"), Nil,
Seq(
Term.ApplyInfix(
Term.Tuple(Seq(Term.Name("i"), Term.Name("b"))),
Term.Name("::"), Nil, Seq(Term.Name("z"))))),
Term.Name("max")))),
Case(
Pat.ExtractInfix(
Pat.Tuple(
Seq(
Pat.Var.Term(Term.Name("i")),
Pat.Extract(
Term.Name("Nest"), Nil,
Seq(
Pat.Var.Term(Term.Name("j")),
Pat.Var.Term(Term.Name("d")))))),
Term.Name("::"), Seq(Pat.Var.Term(Term.Name("z")))),
None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.Name("pos"),
Term.ApplyInfix(
Term.Tuple(
Seq(
Term.ApplyInfix(
Term.Name("i"), Term.Name("+"), Nil, Seq(Term.Name("j"))),
Term.Name("d"))),
Term.Name("::"), Nil, Seq(Term.Name("z"))),
Term.Name("max")))),
Case(
Pat.ExtractInfix(
Pat.Tuple(
Seq(
Pat.Var.Term(Term.Name("i")),
Pat.Extract(
Term.Name("Text"), Nil, Seq(Pat.Var.Term(Term.Name("s")))))),
Term.Name("::"), Seq(Pat.Var.Term(Term.Name("z")))),
None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.ApplyInfix(
Term.Name("pos"), Term.Name("+"), Nil,
Seq(Term.Select(Term.Name("s"), Term.Name("length")))),
Term.Name("z"), Term.Name("max")))),
Case(
Pat.ExtractInfix(
Pat.Tuple(Seq(Pat.Var.Term(Term.Name("i")), Term.Name("Line"))),
Term.Name("::"), Seq(Pat.Var.Term(Term.Name("z")))),
None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.Name("i"), Term.Name("z"),
Term.Apply(
Term.Select(Term.Name("math"), Term.Name("max")),
Seq(Term.Name("max"), Term.Name("pos")))))),
Case(
Pat.ExtractInfix(
Pat.Tuple(
Seq(
Pat.Var.Term(Term.Name("i")),
Pat.Extract(
Term.Name("Union"), Nil,
Seq(Pat.Var.Term(Term.Name("a")), Pat.Wildcard())))),
Term.Name("::"), Seq(Pat.Var.Term(Term.Name("z")))),
None,
Term.Apply(
Term.Name("loop"),
Seq(
Term.Name("pos"),
Term.ApplyInfix(
Term.Tuple(Seq(Term.Name("i"), Term.Name("a"))),
Term.Name("::"), Nil, Seq(Term.Name("z"))),
Term.Name("max"))))))),
Term.Apply(
Term.Name("loop"),
Seq(
Lit(0),
Term.ApplyInfix(
Term.Tuple(Seq(Lit(0), Term.This(Name.Anonymous()))), Term.Name("::"),
Nil, Seq(Term.Name("Nil"))),
Lit(0)))))),
Defn.Def(
Nil, Term.Name("deunioned"), Nil, Nil,
Some(Type.Apply(Type.Name("Stream"), Seq(Type.Name("Doc")))),
Term.Apply(
Term.Select(Term.Name("DocTree"), Term.Name("deunioned")),
Seq(
Term.Apply(
Term.Select(Term.Name("DocTree"), Term.Name("toDocTree")),
Seq(Term.This(Name.Anonymous())))))))))),
Defn.Object(
Nil, Term.Name("Doc"),
Template(
Nil, Nil, Term.Param(Nil, Name.Anonymous(), None, None),
Some(
Seq(
Defn.Object(
Seq(Mod.Private(Name.Indeterminate("paiges")), Mod.Case()), Term.Name("Empty"),
Template(
Nil, Seq(Ctor.Ref.Name("Doc")), Term.Param(Nil, Name.Anonymous(), None, None),
None)),
Defn.Object(
Seq(Mod.Private(Name.Indeterminate("paiges")), Mod.Case()), Term.Name("Line"),
Template(
Nil, Seq(Ctor.Ref.Name("Doc")), Term.Param(Nil, Name.Anonymous(), None, None),
None)),
Defn.Class(
Seq(Mod.Private(Name.Indeterminate("paiges")), Mod.Case()), Type.Name("Text"),
Nil,
Ctor.Primary(
Nil, Ctor.Ref.Name("this"),
Seq(Seq(Term.Param(Nil, Term.Name("str"), Some(Type.Name("String")), None)))),
Template(
Nil, Seq(Ctor.Ref.Name("Doc")), Term.Param(Nil, Name.Anonymous(), None, None),
None)),
Defn.Class(
Seq(Mod.Private(Name.Indeterminate("paiges")), Mod.Case()), Type.Name("Concat"),
Nil,
Ctor.Primary(
Nil, Ctor.Ref.Name("this"),
Seq(
Seq(
Term.Param(Nil, Term.Name("a"), Some(Type.Name("Doc")), None),
Term.Param(Nil, Term.Name("b"), Some(Type.Name("Doc")), None)))),
Template(
Nil, Seq(Ctor.Ref.Name("Doc")), Term.Param(Nil, Name.Anonymous(), None, None),
None)),
Defn.Class(
Seq(Mod.Private(Name.Indeterminate("paiges")), Mod.Case()), Type.Name("Nest"),
Nil,
Ctor.Primary(
Nil, Ctor.Ref.Name("this"),
Seq(
Seq(
Term.Param(Nil, Term.Name("indent"), Some(Type.Name("Int")), None),
Term.Param(Nil, Term.Name("doc"), Some(Type.Name("Doc")), None)))),
Template(
Nil, Seq(Ctor.Ref.Name("Doc")), Term.Param(Nil, Name.Anonymous(), None, None),
None)),
Defn.Class(
Seq(Mod.Private(Name.Indeterminate("paiges")), Mod.Case()), Type.Name("Union"),
Nil,
Ctor.Primary(
Nil, Ctor.Ref.Name("this"),
Seq(
Seq(
Term.Param(Nil, Term.Name("a"), Some(Type.Name("Doc")), None),
Term.Param(
Nil, Term.Name("b"), Some(Type.Function(Nil, Type.Name("Doc"))), None)))),
Template(
Nil, Seq(Ctor.Ref.Name("Doc")), Term.Param(Nil, Name.Anonymous(), None, None),
Some(
Seq(
Defn.Val(
Seq(Mod.Lazy()), Seq(Pat.Var.Term(Term.Name("bDoc"))),
Some(Type.Name("Doc")), Term.Apply(Term.Name("b"), Nil)),
Defn.Def(
Seq(Mod.Override()), Term.Name("toString"), Nil, Nil,
Some(Type.Name("String")),
Term.Interpolate(
Term.Name("s"), Seq(Lit("Union("), Lit(", "), Lit(")")),
Seq(Term.Name("a"), Term.Name("bDoc")))))))),
Defn.Val(
Seq(Mod.Private(Term.This(Name.Anonymous()))),
Seq(Pat.Var.Term(Term.Name("maxSpaceTable"))), None, Lit(20)),
Defn.Val(
Seq(Mod.Private(Term.This(Name.Anonymous()))),
Seq(Pat.Var.Term(Term.Name("spaceArray"))),
Some(Type.Apply(Type.Name("Array"), Seq(Type.Name("Text")))),
Term.Select(
Term.Apply(
Term.Select(
Term.ApplyInfix(
Lit(1), Term.Name("to"), Nil, Seq(Term.Name("maxSpaceTable"))),
Term.Name("map")),
Seq(
Term.Block(
Seq(
Term.Function(
Seq(Term.Param(Nil, Term.Name("i"), None, None)),
Term.Block(
Seq(
Term.Apply(
Term.Name("Text"),
Seq(
Term.ApplyInfix(
Lit(" "), Term.Name("*"), Nil,
Seq(Term.Name("i")))))))))))),
Term.Name("toArray"))),
Defn.Def(
Nil, Term.Name("spaces"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("n"), Some(Type.Name("Int")), None))),
Some(Type.Name("Doc")),
Term.If(
Term.ApplyInfix(Term.Name("n"), Term.Name("<"), Nil, Seq(Lit(1))),
Term.Name("Empty"),
Term.If(
Term.ApplyInfix(
Term.Name("n"), Term.Name("<="), Nil, Seq(Term.Name("maxSpaceTable"))),
Term.Apply(
Term.Name("spaceArray"),
Seq(Term.ApplyInfix(Term.Name("n"), Term.Name("-"), Nil, Seq(Lit(1))))),
Term.Apply(
Term.Name("Text"),
Seq(
Term.ApplyInfix(Lit(" "), Term.Name("*"), Nil, Seq(Term.Name("n")))))))),
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("space"))), Some(Type.Name("Doc")),
Term.Apply(Term.Name("spaceArray"), Seq(Lit(0)))),
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("comma"))), Some(Type.Name("Doc")),
Term.Apply(Term.Name("Text"), Seq(Lit(",")))),
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("line"))), Some(Type.Name("Doc")),
Term.Name("Line")),
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("spaceOrLine"))), Some(Type.Name("Doc")),
Term.Apply(
Term.Name("Union"),
Seq(Term.Name("space"), Term.Function(Nil, Term.Name("line"))))),
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("empty"))), Some(Type.Name("Doc")),
Term.Name("Empty")),
Defn.Val(
Seq(Mod.Implicit()), Seq(Pat.Var.Term(Term.Name("docOrdering"))),
Some(Type.Apply(Type.Name("Ordering"), Seq(Type.Name("Doc")))),
Term.New(
Template(
Nil, Seq(Term.ApplyType(Ctor.Ref.Name("Ordering"), Seq(Type.Name("Doc")))),
Term.Param(Nil, Name.Anonymous(), None, None),
Some(
Seq(
Defn.Def(
Nil, Term.Name("compare"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("x"), Some(Type.Name("Doc")), None),
Term.Param(Nil, Term.Name("y"), Some(Type.Name("Doc")), None))),
Some(Type.Name("Int")),
Term.ApplyInfix(
Term.Name("x"), Term.Name("compare"), Nil, Seq(Term.Name("y"))))))))),
Defn.Def(
Nil, Term.Name("text"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("str"), Some(Type.Name("String")), None))),
Some(Type.Name("Doc")),
Term.Block(
Seq(
Defn.Def(
Nil, Term.Name("tx"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("i"), Some(Type.Name("Int")), None),
Term.Param(Nil, Term.Name("j"), Some(Type.Name("Int")), None))),
Some(Type.Name("Doc")),
Term.If(
Term.ApplyInfix(
Term.Name("i"), Term.Name("=="), Nil, Seq(Term.Name("j"))),
Term.Name("Empty"),
Term.Apply(
Term.Name("Text"),
Seq(
Term.Apply(
Term.Select(Term.Name("str"), Term.Name("substring")),
Seq(Term.Name("i"), Term.Name("j"))))))),
Defn.Def(
Seq(Mod.Annot(Ctor.Ref.Name("tailrec"))), Term.Name("parse"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("i"), Some(Type.Name("Int")), None),
Term.Param(Nil, Term.Name("limit"), Some(Type.Name("Int")), None),
Term.Param(Nil, Term.Name("doc"), Some(Type.Name("Doc")), None))),
Some(Type.Name("Doc")),
Term.If(
Term.ApplyInfix(Term.Name("i"), Term.Name("<"), Nil, Seq(Lit(0))),
Term.ApplyInfix(
Term.Apply(Term.Name("tx"), Seq(Lit(0), Term.Name("limit"))),
Term.Name("+"), Nil, Seq(Term.Name("doc"))),
Term.Match(
Term.Apply(
Term.Select(Term.Name("str"), Term.Name("charAt")),
Seq(Term.Name("i"))),
Seq(
Case(
Lit('\n'), None,
Term.Apply(
Term.Name("parse"),
Seq(
Term.ApplyInfix(
Term.Name("i"), Term.Name("-"), Nil, Seq(Lit(1))),
Term.Name("i"),
Term.ApplyInfix(
Term.ApplyInfix(
Term.Name("Line"), Term.Name("+"), Nil,
Seq(
Term.Apply(
Term.Name("tx"),
Seq(
Term.ApplyInfix(
Term.Name("i"), Term.Name("+"), Nil, Seq(Lit(1))),
Term.Name("limit"))))),
Term.Name("+"), Nil, Seq(Term.Name("doc")))))),
Case(
Pat.Wildcard(), None,
Term.Apply(
Term.Name("parse"),
Seq(
Term.ApplyInfix(
Term.Name("i"), Term.Name("-"), Nil, Seq(Lit(1))),
Term.Name("limit"), Term.Name("doc")))))))),
Term.If(
Term.ApplyInfix(Term.Name("str"), Term.Name("=="), Nil, Seq(Lit(""))),
Term.Name("Empty"),
Term.If(
Term.ApplyInfix(
Term.Select(Term.Name("str"), Term.Name("length")), Term.Name("=="),
Nil, Seq(Lit(1))),
Term.Block(
Seq(
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("c"))), None,
Term.Apply(
Term.Select(Term.Name("str"), Term.Name("charAt")), Seq(Lit(0)))),
Term.If(
Term.ApplyInfix(
Term.ApplyInfix(
Lit(' '), Term.Name("<="), Nil, Seq(Term.Name("c"))),
Term.Name("&&"), Nil,
Seq(
Term.ApplyInfix(
Term.Name("c"), Term.Name("<="), Nil, Seq(Lit('~'))))),
Term.Apply(
Term.Name("charTable"),
Seq(
Term.ApplyInfix(
Term.Select(Term.Name("c"), Term.Name("toInt")),
Term.Name("-"), Nil, Seq(Lit(32))))),
Term.If(
Term.ApplyInfix(
Term.Name("c"), Term.Name("=="), Nil, Seq(Lit('\n'))),
Term.Name("Line"),
Term.Apply(Term.Name("Text"), Seq(Term.Name("str"))))))),
Term.If(
Term.ApplyInfix(
Term.Apply(
Term.Select(Term.Name("str"), Term.Name("indexOf")),
Seq(Lit('\n'))),
Term.Name("<"), Nil, Seq(Lit(0))),
Term.Apply(Term.Name("Text"), Seq(Term.Name("str"))),
Term.Apply(
Term.Name("parse"),
Seq(
Term.ApplyInfix(
Term.Select(Term.Name("str"), Term.Name("length")),
Term.Name("-"), Nil, Seq(Lit(1))),
Term.Select(Term.Name("str"), Term.Name("length")),
Term.Name("Empty"))))))))),
Defn.Val(
Seq(Mod.Private(Term.This(Name.Anonymous()))),
Seq(Pat.Var.Term(Term.Name("charTable"))),
Some(Type.Apply(Type.Name("Array"), Seq(Type.Name("Doc")))),
Term.Select(
Term.Apply(
Term.Select(
Term.ApplyInfix(Lit(32), Term.Name("to"), Nil, Seq(Lit(126))),
Term.Name("map")),
Seq(
Term.Block(
Seq(
Term.Function(
Seq(Term.Param(Nil, Term.Name("i"), None, None)),
Term.Block(
Seq(
Term.Apply(
Term.Name("Text"),
Seq(
Term.Select(
Term.Select(Term.Name("i"), Term.Name("toChar")),
Term.Name("toString"))))))))))),
Term.Name("toArray"))),
Defn.Def(
Nil, Term.Name("str"),
Seq(Type.Param(Nil, Type.Name("T"), Nil, Type.Bounds(None, None), Nil, Nil)),
Seq(Seq(Term.Param(Nil, Term.Name("t"), Some(Type.Name("T")), None))),
Some(Type.Name("Doc")),
Term.Apply(
Term.Name("text"), Seq(Term.Select(Term.Name("t"), Term.Name("toString"))))),
Defn.Val(
Seq(Mod.Private(Name.Anonymous())),
Seq(Pat.Var.Term(Term.Name("splitWhitespace"))), Some(Type.Name("Regex")),
Term.Select(Lit("\\s+"), Term.Name("r"))),
Defn.Def(
Nil, Term.Name("split"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("str"), Some(Type.Name("String")), None),
Term.Param(
Nil, Term.Name("pat"), Some(Type.Name("Regex")),
Some(Term.Select(Term.Name("Doc"), Term.Name("splitWhitespace")))),
Term.Param(
Nil, Term.Name("sep"), Some(Type.Name("Doc")),
Some(Term.Select(Term.Name("Doc"), Term.Name("spaceOrLine")))))),
Some(Type.Name("Doc")),
Term.Apply(
Term.Apply(
Term.Name("foldDocs"),
Seq(
Term.Apply(
Term.Select(
Term.Apply(
Term.Select(
Term.Select(Term.Name("pat"), Term.Name("pattern")),
Term.Name("split")),
Seq(Term.Name("str"), Lit(-1))),
Term.Name("map")),
Seq(Term.Select(Term.Name("Doc"), Term.Name("text")))))),
Seq(
Term.Function(
Seq(
Term.Param(Nil, Term.Name("x"), None, None),
Term.Param(Nil, Term.Name("y"), None, None)),
Term.ApplyInfix(
Term.Name("x"), Term.Name("+"), Nil,
Seq(
Term.ApplyInfix(
Term.Name("sep"), Term.Name("+"), Nil, Seq(Term.Name("y"))))))))),
Defn.Def(
Nil, Term.Name("fill"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("sep"), Some(Type.Name("Doc")), None),
Term.Param(
Nil, Term.Name("ds"),
Some(Type.Apply(Type.Name("Iterable"), Seq(Type.Name("Doc")))), None))),
Some(Type.Name("Doc")),
Term.Block(
Seq(
Defn.Def(
Seq(Mod.Annot(Ctor.Ref.Name("tailrec"))), Term.Name("fillRec"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("x"), Some(Type.Name("Doc")), None),
Term.Param(
Nil, Term.Name("lst"),
Some(Type.Apply(Type.Name("List"), Seq(Type.Name("Doc")))), None),
Term.Param(
Nil, Term.Name("stack"),
Some(
Type.Apply(
Type.Name("List"),
Seq(Type.Function(Seq(Type.Name("Doc")), Type.Name("Doc"))))),
None))),
Some(Type.Name("Doc")),
Term.Match(
Term.Name("lst"),
Seq(
Case(
Term.Name("Nil"), None,
Term.Apply(
Term.Name("call"), Seq(Term.Name("x"), Term.Name("stack")))),
Case(
Pat.ExtractInfix(
Pat.Var.Term(Term.Name("y")), Term.Name("::"),
Seq(Pat.Var.Term(Term.Name("tail")))),
None,
Term.Block(
Seq(
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("xsep"))), None,
Term.ApplyInfix(
Term.Name("x"), Term.Name("+"), Nil, Seq(Term.Name("sep")))),
Term.Match(
Term.Tuple(
Seq(
Term.Select(Term.Name("xsep"), Term.Name("flattenOption")),
Term.Select(Term.Name("y"), Term.Name("flattenOption")))),
Seq(
Case(
Pat.Tuple(
Seq(
Pat.Extract(
Term.Name("Some"), Nil,
Seq(Pat.Var.Term(Term.Name("flatx")))),
Pat.Extract(
Term.Name("Some"), Nil,
Seq(Pat.Var.Term(Term.Name("flaty")))))),
None,
Term.Block(
Seq(
Defn.Def(
Nil, Term.Name("cont"), Nil,
Seq(
Seq(
Term.Param(
Nil, Term.Name("resty"), Some(Type.Name("Doc")),
None))),
None,
Term.Block(
Seq(
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("first"))),
None,
Term.Apply(
Term.Select(
Term.Name("flatx"), Term.Name("space")),
Seq(Term.Name("resty")))),
Defn.Def(
Nil, Term.Name("second"), Nil, Nil, None,
Term.ApplyInfix(
Term.Name("xsep"), Term.Name("/"), Nil,
Seq(
Term.Apply(
Term.Name("cheatRec"),
Seq(
Term.Name("y"), Term.Name("tail")))))),
Term.Apply(
Term.Name("Union"),
Seq(
Term.Name("first"),
Term.Function(Nil, Term.Name("second"))))))),
Term.Apply(
Term.Name("fillRec"),
Seq(
Term.Name("flaty"), Term.Name("tail"),
Term.ApplyInfix(
Term.Eta(Term.Name("cont")), Term.Name("::"), Nil,
Seq(Term.Name("stack")))))))),
Case(
Pat.Tuple(
Seq(
Pat.Extract(
Term.Name("Some"), Nil,
Seq(Pat.Var.Term(Term.Name("flatx")))),
Term.Name("None"))),
None,
Term.Block(
Seq(
Defn.Def(
Nil, Term.Name("cont"), Nil,
Seq(
Seq(
Term.Param(
Nil, Term.Name("resty"), Some(Type.Name("Doc")),
None))),
None,
Term.Block(
Seq(
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("first"))),
None,
Term.Apply(
Term.Select(
Term.Name("flatx"), Term.Name("space")),
Seq(Term.Name("resty")))),
Defn.Def(
Nil, Term.Name("second"), Nil, Nil, None,
Term.ApplyInfix(
Term.Name("xsep"), Term.Name("/"), Nil,
Seq(Term.Name("resty")))),
Term.Apply(
Term.Name("Union"),
Seq(
Term.Name("first"),
Term.Function(Nil, Term.Name("second"))))))),
Term.Apply(
Term.Name("fillRec"),
Seq(
Term.Name("y"), Term.Name("tail"),
Term.ApplyInfix(
Term.Eta(Term.Name("cont")), Term.Name("::"), Nil,
Seq(Term.Name("stack")))))))),
Case(
Pat.Tuple(
Seq(
Term.Name("None"),
Pat.Extract(
Term.Name("Some"), Nil,
Seq(Pat.Var.Term(Term.Name("flaty")))))),
None,
Term.Block(
Seq(
Defn.Def(
Nil, Term.Name("cont"), Nil,
Seq(
Seq(
Term.Param(
Nil, Term.Name("resty"), Some(Type.Name("Doc")),
None))),
None,
Term.Block(
Seq(
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("first"))),
None,
Term.Apply(
Term.Select(
Term.Name("xsep"), Term.Name("space")),
Seq(Term.Name("resty")))),
Defn.Def(
Nil, Term.Name("second"), Nil, Nil, None,
Term.ApplyInfix(
Term.Name("xsep"), Term.Name("/"), Nil,
Seq(
Term.Apply(
Term.Name("cheatRec"),
Seq(
Term.Name("y"), Term.Name("tail")))))),
Term.Apply(
Term.Name("Union"),
Seq(
Term.Name("first"),
Term.Function(Nil, Term.Name("second"))))))),
Term.Apply(
Term.Name("fillRec"),
Seq(
Term.Name("flaty"), Term.Name("tail"),
Term.ApplyInfix(
Term.Eta(Term.Name("cont")), Term.Name("::"), Nil,
Seq(Term.Name("stack")))))))),
Case(
Pat.Tuple(Seq(Term.Name("None"), Term.Name("None"))), None,
Term.Apply(
Term.Name("fillRec"),
Seq(
Term.Name("y"), Term.Name("tail"),
Term.ApplyInfix(
Term.Apply(
Term.Select(
Term.Name("xsep"), Term.Name("spaceOrLine")),
Seq(
Term.Ascribe(
Term.Placeholder(), Type.Name("Doc")))),
Term.Name("::"), Nil,
Seq(Term.Name("stack")))))))))))))),
Defn.Def(
Nil, Term.Name("cheatRec"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("x"), Some(Type.Name("Doc")), None),
Term.Param(
Nil, Term.Name("lst"),
Some(Type.Apply(Type.Name("List"), Seq(Type.Name("Doc")))), None))),
Some(Type.Name("Doc")),
Term.Apply(
Term.Name("fillRec"),
Seq(Term.Name("x"), Term.Name("lst"), Term.Name("Nil")))),
Term.Match(
Term.Select(Term.Name("ds"), Term.Name("toList")),
Seq(
Case(Term.Name("Nil"), None, Term.Name("Empty")),
Case(
Pat.ExtractInfix(
Pat.Var.Term(Term.Name("h")), Term.Name("::"),
Seq(Pat.Var.Term(Term.Name("tail")))),
None,
Term.Apply(
Term.Name("fillRec"),
Seq(Term.Name("h"), Term.Name("tail"), Term.Name("Nil"))))))))),
Defn.Def(
Nil, Term.Name("foldDocs"), Nil,
Seq(
Seq(
Term.Param(
Nil, Term.Name("ds"),
Some(Type.Apply(Type.Name("Iterable"), Seq(Type.Name("Doc")))), None)),
Seq(
Term.Param(
Nil, Term.Name("fn"),
Some(
Type.Function(Seq(Type.Name("Doc"), Type.Name("Doc")), Type.Name("Doc"))),
None))),
Some(Type.Name("Doc")),
Term.If(
Term.Select(Term.Name("ds"), Term.Name("isEmpty")),
Term.Select(Term.Name("Doc"), Term.Name("empty")),
Term.Block(
Seq(
Defn.Val(
Nil, Seq(Pat.Var.Term(Term.Name("xs"))), None,
Term.Select(Term.Name("ds"), Term.Name("toArray"))),
Defn.Var(
Nil, Seq(Pat.Var.Term(Term.Name("d"))), None,
Some(
Term.Apply(
Term.Name("xs"),
Seq(
Term.ApplyInfix(
Term.Select(Term.Name("xs"), Term.Name("length")), Term.Name("-"),
Nil, Seq(Lit(1))))))),
Defn.Var(
Nil, Seq(Pat.Var.Term(Term.Name("i"))), None,
Some(
Term.ApplyInfix(
Term.Select(Term.Name("xs"), Term.Name("length")), Term.Name("-"),
Nil, Seq(Lit(2))))),
Term.While(
Term.ApplyInfix(Term.Name("i"), Term.Name(">="), Nil, Seq(Lit(0))),
Term.Block(
Seq(
Term.Assign(
Term.Name("d"),
Term.Apply(
Term.Name("fn"),
Seq(
Term.Apply(Term.Name("xs"), Seq(Term.Name("i"))),
Term.Name("d")))),
Term.ApplyInfix(Term.Name("i"), Term.Name("-="), Nil, Seq(Lit(1)))))),
Term.Name("d"))))),
Defn.Def(
Nil, Term.Name("paragraph"), Nil,
Seq(Seq(Term.Param(Nil, Term.Name("s"), Some(Type.Name("String")), None))),
Some(Type.Name("Doc")), Term.Apply(Term.Name("split"), Seq(Term.Name("s")))),
Defn.Def(
Nil, Term.Name("intercalate"), Nil,
Seq(
Seq(
Term.Param(Nil, Term.Name("sep"), Some(Type.Name("Doc")), None),
Term.Param(
Nil, Term.Name("ds"),
Some(Type.Apply(Type.Name("Iterable"), Seq(Type.Name("Doc")))), None))),
Some(Type.Name("Doc")),
Term.If(
Term.Select(Term.Name("sep"), Term.Name("isEmpty")),
Term.Apply(
Term.Apply(Term.Name("foldDocs"), Seq(Term.Name("ds"))),
Seq(
Term.Apply(
Term.Name("Concat"), Seq(Term.Placeholder(), Term.Placeholder())))),
Term.Apply(
Term.Apply(Term.Name("foldDocs"), Seq(Term.Name("ds"))),
Seq(
Term.Block(
Seq(
Term.Function(
Seq(
Term.Param(Nil, Term.Name("a"), None, None),
Term.Param(Nil, Term.Name("b"), None, None)),
Term.Block(
Seq(
Term.Apply(
Term.Name("Concat"),
Seq(
Term.Name("a"),
Term.Apply(
Term.Name("Concat"),
Seq(Term.Name("sep"), Term.Name("b")))))))))))))),
Defn.Def(
Nil, Term.Name("spread"), Nil,
Seq(
Seq(
Term.Param(
Nil, Term.Name("ds"),
Some(Type.Apply(Type.Name("Iterable"), Seq(Type.Name("Doc")))), None))),
Some(Type.Name("Doc")),
Term.Apply(Term.Name("intercalate"), Seq(Term.Name("space"), Term.Name("ds")))),
Defn.Def(
Nil, Term.Name("stack"), Nil,
Seq(
Seq(
Term.Param(
Nil, Term.Name("ds"),
Some(Type.Apply(Type.Name("Iterable"), Seq(Type.Name("Doc")))), None))),
Some(Type.Name("Doc")),
Term.Apply(
Term.Name("intercalate"), Seq(Term.Name("line"), Term.Name("ds"))))))))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment