from sealed class to record
fix type
split file
fix dependence
add CoYoneda