Os tipos opacos em Gleam são tipos personalizados em que só o módulo que define o tipo pode construir ou fazer correspondência de padrões sobre valores desse tipo. Isto é útil para criar tipos que só devem ser usados de uma forma específica.
Os tipos opacos definem-se com a palavra-chave opaque.
pub opaque type PositiveInt {
PositiveInt(inner: Int)
}
Este tipo PositiveInt serve para situações em que se quer um inteiro, mas que tem de ser zero ou maior. Um Int normal de Gleam não podia ser usado, porque também pode ser negativo.
O módulo que define este tipo pode definir uma função para obter o valor inteiro interior, e uma função para criar o tipo PositiveInt, que devolve 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 esta API, os outros módulos não conseguem construir um PositiveInt com um valor negativo, por isso qualquer função que receba um PositiveInt pode ter a certeza de que o valor é positivo.