Packages

A hardcore language for buildling extreme systems

Current section

Files

Jump to
gloom src repr.gleam
Raw

src/repr.gleam

import gleam/int
import gleam/io
import gleam/float
import gleam/list
import gleam/map
import gleam/string_builder
import template.{template_replace_all}
import affinity.{Everything, GloomAffinity, Nothing, Something}
import dtype.{GloomType, Number, String, Table}
import gleam_value.{
FloatValue, GleamValue, GloomObject, IntValue, MapValue, ObjectValue,
StringValue, length,
}
fn gloom_table_list_repr(table: map.Map(GleamValue, GleamValue)) {
let key_value_repr = fn(item) {
let #(key, value) = item
string_builder.from_string(value_repr(key))
|> string_builder.append(" =>")
|> string_builder.append(value_repr(value))
|> string_builder.append("\n")
}
table
|> map.to_list
|> list.map(key_value_repr)
|> string_builder.concat
|> string_builder.to_string
}
fn value_repr(gloom_value: GleamValue) {
case gloom_value {
IntValue(value) -> int.to_string(value)
FloatValue(value) -> float.to_string(value)
StringValue(value) -> "'" <> value <> "'"
MapValue(value) -> gloom_table_list_repr(value)
ObjectValue(value) -> object_repr(value)
}
}
fn datatype_repr(datatype: GloomType) {
case datatype {
Number -> "number"
String -> "string"
Table -> "table"
}
}
fn affinity_repr(affinity: GloomAffinity) {
case affinity {
Nothing -> "Nothing"
Everything -> "Everything"
Something -> "Something"
}
}
pub fn object_repr(object: GloomObject) {
case object.datatype {
Table -> {
let len = length(object.properties)
let header_template =
"\n({affinity} {datatype} containing {length} elements):\n \n {value}"
template_replace_all(
header_template,
map.from_list([
#("value", value_repr(object.properties)),
#("datatype", datatype_repr(object.datatype)),
#("affinity", affinity_repr(object.affinity)),
#("length", int.to_string(len)),
]),
)
}
_ -> {
let header_template = "\t{value}:{affinity} "
template_replace_all(
header_template,
map.from_list([
#("value", value_repr(object.properties)),
#("datatype", datatype_repr(object.datatype)),
#("affinity", affinity_repr(object.affinity)),
]),
)
}
}
}
pub fn print(object: GloomObject) {
object
|> object_repr
|> io.println
}