There's a "pattern" that I've been thinking about, which arises in some situation while persisting/serializing objects.
To motivate this, consider the following case class:
scala> case class User(name: String, parents: List[User])
defined class User
scala> val alice = User("Alice", Nil)
alice: User = User(Alice,List())
scala> val bob = User("Bob", alice :: Nil)
bob: User = User(Bob,List(User(Alice,List())))
scala> val charles = User("Charles", bob :: Nil)
charles: User = User(Charles,List(User(Bob,List(User(Alice,List())))))
scala> val users = List(alice, bob, charles)
users: List[User] = List(User(Alice,List()), User(Bob,List(User(Alice,List()))),
User(Charles,List(User(Bob,List(User(Alice,List()))))))
The important part is that it contains parents
field, which contains a list of other users.
Now let's say you want to turn users
list of users into JSON.
[{ "name": "Alice", "parents": [] },
{ "name": "Bob",
"parents": [{ "name": "Alice", "parents": [] }] },
{ "name": "Charles",
"parents": [{ "name": "Bob", "parents": [{ "name": "Alice", "parents": [] }] }] }]