This document discusses modeling domains functionally and with an event-driven approach. It describes representing domain entities as algebraic data types (ADTs) and modeling behaviors as pure functions. State changes are handled through immutable updates instead of mutation. The document also discusses event sourcing, where the state of a domain object is represented as a sequence of events rather than a mutable object. This allows reconstructing any previous state. A sample domain model implementation separates the domain objects from the service layer, which acts as a finite state machine handling events and state transitions.