Skip to content
vic

vic/typeset

An Scala type-indexed set, checked at compile time.

vic/typeset.json
{
"defaultBranch": "main",
"description": "An Scala type-indexed set, checked at compile time.",
"fullName": "vic/typeset",
"homepage": "",
"language": "Scala",
"name": "typeset",
"pushedAt": "2025-07-15T04:35:58Z",
"stargazersCount": 1,
"updatedAt": "2025-07-15T04:36:02Z",
"url": "https://github.com/vic/typeset"
}

An Scala Type indexed set checked at compile time.

a TypeSet is similar to ZIO’s Has[_] type but without any reflection need.

Jars are available for all versions and commits at Jitpack.io.

Creating a TypeSet is always done by prepending something to TNil, which represent the empty TypeSet.

import typeset.*
val x = "Hello" :+: TNil

Of course, being a Set, you can’t duplicate types of values on it.

// val bad = "Hello" :+: "World" :+: TNil // This wont compile!!

The type of the set can be re-arrenged on the left side and any combination containing the same types should be valid.

val a: String :+: Boolean :+: Int :+: TNil = "Hello" :+: true :+: 42 :+: TNil
val b: Int :+: String :+: Boolean :+: TNil = a // types are the same.

TypeSets can be joined together if they contained types do not cause duplicates.

val a = 1 :+: TNil
val b = true :+: TNil
val c = a :+: b // Has type Int :+: Boolean :+: TNil

Once created, you can obtain the value of a type from a Set.

val a = true :+: "Hello" :+: TNil
val x: String = a.get[String] // Returns "Hello"

Removing a type returns it’s current value and another collapsed set without the type present.

val a = true :+: "Hello" :+: TNil
val (x: String, b) = a.drop[String]!() // type of b is Boolean :+: TNil

That’s pretty much it. For more examples you can see the [test code]!(typeset/test/src).

All contributions are welcome, just please be kind and repectful of other people’s time.

For Building, you will need mill installed.

Terminal window
mill __.test # This will run all tests