Skip to content
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.paket
Libs
Tests/Examples
.gitignore
.travis.yml
LICENSE.md
PPrint.Console.paket.template
PPrint.fsx
PPrint.paket.template
PPrint.sln
README.md
appveyor.yml
build.sh
paket.dependencies
paket.lock

README.md

PPrint is a pretty printing combinator library for text documents that can be rendered to a desired maximum width.

Docs

Background

Example

Here is an example of how one could define a function with signature

module Json =
  val pretty: JsonValue -> Doc

for pretty printing JSON values:

open System.Json
open PPrint

let inline (^) x = x

module Json =
  let private prettySeq (l, r) toDoc xs =
    if Seq.isEmpty xs
    then l <^> r
    else let ds = xs |> Seq.map toDoc |> punctuate comma |> vsep
         l <..> ds |> nest 2 <..> r |> group

  let rec pretty (json: JsonValue) =
    match json with
     | :? JsonObject as json ->
       json
       |> prettySeq lrbrace ^ fun kv ->
            pretty ^ JsonPrimitive kv.Key <^> colon <+> pretty kv.Value
     | :? JsonArray as json ->
       json
       |> prettySeq lrbracket pretty
     | null ->
       txt "null"
     | _ ->
       json
       |> string
       |> txt

Given a JSON value

let json = JsonValue.Parse """
{
  "firstName": "John",
  "lastName": "Smith",
  "isAlive": true,
  "age": 25,
  "address": {
    "streetAddress": "21 2nd Street",
    "city": "New York",
    "state": "NY",
    "postalCode": "10021-3100"
  },
  "phoneNumbers": [
    {
      "type": "home",
      "number": "212 555-1234"
    },
    {
      "type": "office",
      "number": "646 555-4567"
    }
  ],
  "children": [],
  "spouse": null
}
"""

we can render it to different desired maximum widths. For example,

json |> Json.pretty |> println ^ Some 40

produces

{
  "address": {
    "city": "New York",
    "postalCode": "10021-3100",
    "state": "NY",
    "streetAddress": "21 2nd Street"
  },
  "age": 25,
  "children": [],
  "firstName": "John",
  "isAlive": true,
  "lastName": "Smith",
  "phoneNumbers": [
    {
      "number": "212 555-1234",
      "type": "home"
    },
    {
      "number": "646 555-4567",
      "type": "office"
    }
  ],
  "spouse": null
}

and

json |> Json.pretty |> println ^ Some 80

produces

{
  "address": {
    "city": "New York",
    "postalCode": "10021-3100",
    "state": "NY",
    "streetAddress": "21 2nd Street"
  },
  "age": 25,
  "children": [],
  "firstName": "John",
  "isAlive": true,
  "lastName": "Smith",
  "phoneNumbers": [
    {"number": "212 555-1234", "type": "home"},
    {"number": "646 555-4567", "type": "office"}
  ],
  "spouse": null
}
You can’t perform that action at this time.