Advertisement
Xsufu

Lection

Nov 5th, 2024 (edited)
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 3.63 KB | Jokes | 0 0
  1. // NoteService
  2.  
  3. package com.eltex.domain
  4. import arrow.core.Either
  5. import com.eltex.data.Note
  6. import com.eltex.utils.NoteNotFound
  7. interface NoteService {
  8.     /**
  9.      * Если id == 0, создаёт новую, если id равен существующей заметке, сохраняет
  10.      * В случае, если указан некорректный id, выводит NoteNotFound
  11.      * При обновлении updatedAt должно заполняться текущим временем
  12.      * @throws IllegalArgumentException
  13.      */
  14.     fun save(note: Note): Either<NoteNotFound, Note>
  15.     /**
  16.      * Возвращает копию внутреннего списка
  17.      */
  18.     fun getAll(): List<Note>
  19.     /**
  20.      * Возвращает список текстов без повторов
  21.      */
  22.     fun getAllUniqueTexts(): List<String>
  23.     /**
  24.      * Возвращает несколько заметок старше указанного id
  25.      * @param count – сколько заметок отсчитать
  26.      * @param id - относительно какого элемента отсчитывать
  27.      */
  28.     fun getBefore(count: Int, id: Long): List<Note>
  29.     /**
  30.      * Возвращает несколько заметок новее указанного id
  31.      * @param count – сколько заметок отсчитать
  32.      * @param id - относительно какого элемента отсчитывать
  33.      */
  34.     fun getAfter(count: Int, id: Long): List<Note>
  35. }
  36.  
  37.  
  38. // NoteServiceImpl
  39.  
  40. package com.eltex.data
  41.  
  42. import arrow.core.Either
  43. import arrow.core.left
  44. import arrow.core.right
  45. import com.eltex.domain.NoteService
  46. import com.eltex.utils.NoteNotFound
  47. import java.time.Instant
  48.  
  49. class NoteServiceImpl : NoteService {
  50.     private val noteList = mutableListOf<Note>()
  51.     private var noteId: Long = 1L
  52.  
  53.     override fun save(note: Note): Either<NoteNotFound, Note> {
  54.         return when (note.id) {
  55.             0L -> {
  56.                 noteList.add(
  57.                     Note(id = noteId++, text = note.text)
  58.                 )
  59.  
  60.                 noteList.last().right()
  61.             }
  62.  
  63.             else -> {
  64.                 val noteIndex = noteList.indexOfFirst { it.id == note.id }
  65.  
  66.                 if (noteIndex > 0) {
  67.                     noteList[noteIndex] = noteList[noteIndex].copy(text = note.text, updatedAt = Instant.now())
  68.  
  69.                     noteList[noteIndex].right()
  70.                 } else {
  71.                     NoteNotFound("Заметка с id ${note.id} не найдена").left()
  72.                 }
  73.             }
  74.         }
  75.     }
  76.  
  77.     override fun getAll(): List<Note> = noteList
  78.  
  79.     override fun getAllUniqueTexts(): List<String> =
  80.         noteList.asSequence()
  81.             .map { it.text }
  82.             .distinct()
  83.             .toList()
  84.  
  85.     override fun getBefore(count: Int, id: Long): List<Note> =
  86.         noteList.dropLastWhile { it.id >= id }
  87.             .sortedByDescending { it.id }
  88.             .take(count)
  89.  
  90.     override fun getAfter(count: Int, id: Long) =
  91.         noteList.dropWhile { it.id <= id }
  92.             .sortedBy { it.id }
  93.             .take(count)
  94. }
  95.  
  96.  
  97.  
  98.  
  99.  
  100. // Note
  101.  
  102. package com.eltex.data
  103. import java.time.Instant
  104. data class Note (
  105.     val id: Long = 0L,
  106.     val text: String = "",
  107.     val createdAt: Instant = Instant.now(),
  108.     val updatedAt: Instant = Instant.now()
  109. )
  110.  
  111.     println(noteServiceImpl.getAll())
  112.  
  113.     println(
  114.     noteServiceImpl.getAllUniqueTexts())
  115.  
  116.     println(
  117.         noteServiceImpl.getBefore(3, 8L)
  118.     )
  119.  
  120.     println(
  121.         noteServiceImpl.getAfter(3, 3L)
  122.     )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement