Structs provide a simple data model, especially with private members for encapsulation.
Augmenting structs is encouraged, as in:
module Plop struct Point = { _id, x, y } augment Plop.types.Point { function str = |this| -> "{id=" + this: _id() + ",x=" + this: x() + ",y=" + this: y() + "}" }
When an augmentation on a struct is defined within the same module, then you can omit the full type name of the struct:
module Plop struct Point = { _id, x, y } augment Point { function str = |this| -> "{id=" + this: _id() + ",x=" + this: x() + ",y=" + this: y() + "}" }
Again, it is important to note that augmentations can only access private struct members when they originate from the same module.
Of course doing the following is a bad idea, with the concise augmentation taking over the fully-qualified one:
module Foo struct Value = { v } augment Foo.types.Value { function a = |this| -> "a" } # This will discard the previous augmentation... augment Value { function b = |this| -> "a" } function check = { let v = Value(666) # Ok v: b() # Fails, the concise augmentation overrides the fully-qualifed one v: a() }