Awesome
BinaryTraits.jl
BinaryTraits focuses on usability - traits should be simple to understand and easy to use. For that reason, every trait is binary. An object either has the trait (positive) or does not have the trait (negative).
The design is heavily influenced by the Holy Traits pattern as explained in my Holy Traits book excerpt as well as in Julia manual's trait-based dispatch section. If you think about Holy Traits as the powerful manual transmission, then BinaryTraits gives you automatic transmission. The machinery is the same but it is a lot more pleasant to use.
NOTE: This package is under active development and we may introduce breaking changes. Please follow the issues list if you would like to contribute to the project or have a stake in the design.
Motivation
Just a quick example below. More details can be found in our documentation.
# Use package and import desired positive/negative trait type aliases
using BinaryTraits
using BinaryTraits.Prefix: Can
# Define a trait and its interface contracts
@trait Fly
@implement Can{Fly} by fly(_, destination::Location, speed::Float64)
# Define your data type and implementation
struct Bird end
fly(::Bird, destination::Location, speed::Float64) = "Wohoo! Arrived! 🐦"
# Assign your data type to a trait
@assign Bird with Can{Fly}
# Verify that your implementation is correct
@check(Bird)
# Dispatch for all flying things
@traitfn flap(::Can{Fly}, freq::Float64) = "Flapping wings at $freq Hz"
Main Features
Current features are listed below. Additional features are planned and logged in the issues list.
- Define traits and assigning them to your own data types
- Define composite traits that exhibits all of the underlying traits
- Define interface contracts required for a trait
- Verify that your data type fully implements all interface contracts
- Define traits/interfaces in one module and use them from another module
- Define trait dispatch functions easily
Credits
- Klaus Crusius for his ideas, articulation, and significant contributions to this project
- Jānis Erdmanis for his proposal of a new design based upon parametric types
Related Projects
There are quite a few traits libraries around. If this package isn't for you, take a look at these others: