///|
/// Lens between A and B
struct Lens[A, B] {
get : (A) -> B
set : (A, B) -> A
}
///|
/// Prism between A and B
struct Prism[A, B] {
get : (A) -> B?
set : (A, B) -> A
}
///|
/// Isomorphism between A and B
struct Iso[A, B] {
to : (A) -> B
from : (B) -> A
}
///|
/// Epimorphism between A and B
struct Epi[A, B] {
to : (A) -> B?
from : (B) -> A
}