Skip to main content



This document is a work in progress. It's not complete and it's not final.

The purpose of this document is to spec TypeStream language features.

While TypeStream syntax is inspired by bash, feature parity is a non goal of the project.




By default, TypeStream doesn't need a syntax to specify types. It can infer types from context.

  • String
  • Number
  • List
  • DataStream


In TypeStream, a DataStream is a typed source of data. TypeStream always outputs structured data (defaulting to encoding data in JSON).

Let's start from some examples:

# words is a "string" stream, meaning each message value is a string

$ cat words # 1,"first word" 2,"second word"

# users is a "record" topic, meaning each message value is structured record (can be avro, json, protobuf, etc..)

$ cat users # 1, [name: Foo, age: 42] 2, [name: Bar, age: 24]

# what happens if we join users and words?

$ join users words

# 1, [users: {name: Foo, age: 42}, words: "first word"]
# 2, [users: {name: Foo, age: 42}, words: "second word"]

Merging data streams

Block expression

Block expressions define anonymous functions that take one parameter. They're used by TypeStream data operators like each and enrich.

Here's their syntax:

{ <var> -> <pipeline> }

and an example using the each operator:

cat users | each { user -> echo $user }

In the example above, the user variable is bound to each record in the users data stream.