package com.zibaldone.cats
package ch_01
import cats.Semigroup
import cats.instances.int.*
import cats.syntax.semigroup.*
// will throw an exception on empty iterables
extension [T: Semigroup](iterable: Iterable[T])
// ex. use extension method
def reduceIterable: T = iterable.reduce(_ |+| _)
trait `semigroup`[A]:
def combine(x: A, y: A): A
final case class Expense(id: Long, amount: Double)
object Expense:
// ex. support new type
given Semigroup[Expense] = Semigroup.instance { (a, b) => Expense(a.id |+| b.id, a.amount |+| b.amount) }