Skip to content

Latest commit

 

History

History
32 lines (25 loc) · 1023 Bytes

README.md

File metadata and controls

32 lines (25 loc) · 1023 Bytes

This repository contains a simple implementation of a compile-time sized linked list SList[A, N <: Int], where N is a literal type of its size.

The list is implemented using Scala 3 metaprogramming features in macros-less approach.

Some examples SList's capabilities:

// list creation
val intList: SList[Int, 3] = 1 :: 2 :: 3 :: SNil
val stringList: SList[String, 2] = "foo" :: "bar" :: SNil
val emptyList: SList[Int, 0] = SNil

// list type refinement based on its size
val refinedIntList: SCons[Int, 2] = intList.refined
val refinedEmptyList: SNil.type = emptyList.refined

// compile-time safe head/tail
stringList.head // foo
stringList.tail // SList(bar): SList[String, 1]

// compile time error: the size of stringList.tail.tail is 0
stringList.tail.tail.head
stringList.tail.tail.tail

// a for-comprehension example

// SList(1foo,1bar,2foo,2bar,3foo,3bar)
val combinedList: SList[String, 6] = for {
	int <- intList
	string <- stringList
	resultValue = int.toString + string
} yield resultValue