Tipos opacos em Gleam são tipos personalizados em que apenas o módulo que define o tipo pode construir valores desse tipo ou fazer correspondência de padrões com eles. Isso é útil para criar tipos que só devem ser usados de uma maneira específica.
Os tipos opacos são definidos com a palavra-chave opaque.
pub opaque type PositiveInt {
PositiveInt(inner: Int)
}
Esse tipo PositiveInt deve ser usado em situações em que se quer um Int, mas o valor precisa ser zero ou maior. Um Int comum do Gleam não poderia ser usado, já que também pode ser negativo.
O módulo que define esse tipo pode definir uma função para obter o valor inteiro interno e uma função para criar o tipo PositiveInt, que retornará um erro se o valor não for positivo.
pub fn from_int(i: Int) -> Result(PositiveInt, String) {
case i {
_ if i < 0 -> Error("Value must be positive")
_ -> Ok(PositiveInt(i))
}
}
pub fn to_int(i: PositiveInt) -> Int {
i.inner
}
Com essa API, outros módulos não conseguem construir um PositiveInt com um valor negativo, então qualquer função que receba um PositiveInt pode ter certeza de que o valor é positivo.