У меня есть 2 элемента данных itemDto и itemEntity, и они выглядят так.Функциональная композиция Scalaz с будущим
trait ItemDto{
def id: Long
def name: String
}
trait ItemEntity {
def id: Long
def name: String
}
case class Entity(id: Long, name: String) extends ItemEntity
case class Dto(id: Long, name: String) extends ItemDto
Я хотел бы создать линию трубы, которая выглядит, как этот
ItemDto => ItemEntity => ItemEntity => Future[ItemEntity] => Future[ItemEntity] => Future[ItemDto]
У меня есть некоторые функции картографа, а
object ItemMapper {
def mapDtoToEntity(dto: ItemDto): ItemEntity = {
Entity(dto.id, dto.name)
}
def mapEntityToDto(entity: ItemEntity): ItemDto = {
Dto(entity.id, entity.name)
}
}
функцию, которая получает приращение идентификатора хозяйствующего субъекта
object ItemEntity{
def incrementId(entity: ItemEntity) = Entity(entity.id + 1, entity.name)
}
и повторно представляет собой хранилище для сохранения сущностей
object ItemRepository {
def save(entity: ItemEntity): Future[ItemEntity] = {
Future{entity}
}
}
наконец мой метод, который сочетает в себе все эти функции, чтобы сделать что-то выглядит как этот
import ItemMapper._
import ItemRepository.save
import ItemEntity.incrementId
def addItem(dto: ItemDto) = {
(mapDtoToEntity _ >>> incrementId >>> save >>> {_ map (incrementId _ >>> mapEntityToDto) })(dto)
}
После того, как метод сохранения называется в цепи, я должен разорвать в другую функцию. Мой вопрос: есть ли способ извлечь выгоду из будущего и вернуть ее, чтобы мой конвейер выглядел примерно так?
(mapDtoToEntity _ >>> incrementId >>> save ?!? incrementId ?!? mapEntityToDto)(dto)
Где ?!?
является гипотетическим оператором.
Это может быть и библиотека scala. Это не должно быть от scalaz.
Спасибо за действительно хорошее объяснение kleisli. Раньше я был знаком с ним и теперь лучше разбираюсь в этом. Мне было действительно интересно, есть ли оператор, который сделал это автоматически, и он не выглядит так, как есть. Кстати, двойной прирост был надуманным примером нескольких операций в конвейере. Я не делаю этого в своих проектах. – decapo