this is quite interesting, because I think there could be overlaps between the data-oriented approach and protocol-orientation.
probably I have my own definition of what the latter means, but you can compose the behaviour not on the data, but on the context side with protocols (and protocol extensions).
so you can still have a dynamic data type (if you want), and the context can deal with it, because there’s a protocol that extends the context so now it knows how to handle that data type.
redux can be a good analogy, you have reducers (behaviours defined on the context) composed out of smaller reducers. so you have contexts that are composed out of smaller contexts.
does this make any sense? or am I confusing myself and others?:)