SkillAgentSearch skills...

Formatting

Type-safe, functional string formatting in Swift.

Install / Use

/learn @stephencelis/Formatting
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

Formatting

Type-safe, functional string formatting in Swift.

Inspired by Chris Done's excellent Haskell library.

import Formatting

format("Hello, " % string % "!", "world")
// "Hello, world!"

Introduction

Traditional string formatting methods (interpolation, printf, and template strings) can lead to subtle (and not so subtle) runtime bugs.

print("Hello, \(thing)!")              // Hello, nil!
print("Hello, \(thing)!")              // Hello, Optional("world")!
NSLog(@"Hello, %@!", thing);           // Hello, (null)!

Formatting brings compile-time checks.

print("Hello, " % string % "!", thing) // Value of optional type String? not unwrapped

And composability.

let greet =
  format("Hello, " % string % "!")

greet("world")                         // Hello, world!
<!-- ## Formatters -->

Composing formatters

Use % to build a formatter with strings and other formatters.

format(string % " is " % int % "years old.", "Alice", 25)
// "Alice is 25 years old."

Use <> to pass the previous formatter argument to the next formatter.

format(yyyy % "-" <> MM % "-" <> dd, Date())
// "2016-06-28"

Use .% to feed the result of one formatter into another.

format(left(2, "0") .% hex, 10)
// "0a"

Call format without arguments to return a curried formatter function.

let log =
  format(right(5) % " -- [" % iso8601 % "] " % string)

let infoLog = log("INFO")
let debugLog = log("DEBUG")

infoLog(Date())("Logging in...")
// "INFO  -- [2016-06-28T12:34:56Z] Logging in..."
debugLog(Date())("Logged in successfully!")
// "DEBUG -- [2016-06-28T12:34:56Z] Logged in successfully!"

License

Formatting is available under the MIT license. See the LICENSE file for more information.

View on GitHub
GitHub Stars247
CategoryDevelopment
Updated1mo ago
Forks6

Languages

Swift

Security Score

100/100

Audited on Feb 26, 2026

No findings