trait CanQuantify
[Q, T
] { }
def +
(that
: Quantity
[T
])(implicit q
: CanQuantify
[Self, T
], num
: Numeric
[T
]) = { q(value + that.value)
}
def /
[R
<: Quantity
[T
]](that
: R
)(implicit num
: Numeric
[T
]) = { Per[T, Self, R](value * that.value)
}
}
case class Per
[T, Q
<: Quantity
[T
], R
<: Quantity
[T
]](value
: T
) extends Quantity
[T
] { }
}
}
implicit val productCountCanQuantify
= new CanQuantify
[ProductCount, Int
] { }
}
}
val products
= ProductCount
(10) }
dHJhaXQgQ2FuUXVhbnRpZnlbUSwgVF0gewogIGRlZiBhcHBseSh2YWx1ZTogVCk6IFEKfQoKdHJhaXQgUXVhbnRpdHlbVF0gewogIHR5cGUgU2VsZiA8OiBRdWFudGl0eVtUXQoKICBkZWYgdmFsdWU6IFQKCiAgZGVmICsodGhhdDogUXVhbnRpdHlbVF0pKGltcGxpY2l0IHE6IENhblF1YW50aWZ5W1NlbGYsIFRdLCBudW06IE51bWVyaWNbVF0pID0gewogIAlpbXBvcnQgbnVtLl8KICAJcSh2YWx1ZSArIHRoYXQudmFsdWUpCiAgfQoKICBkZWYgL1tSIDw6IFF1YW50aXR5W1RdXSh0aGF0OiBSKShpbXBsaWNpdCBudW06IE51bWVyaWNbVF0pID0gewogIAlpbXBvcnQgbnVtLl8KICAgIFBlcltULCBTZWxmLCBSXSh2YWx1ZSAqIHRoYXQudmFsdWUpCiAgfQp9CgpjYXNlIGNsYXNzIFBlcltULCBRIDw6IFF1YW50aXR5W1RdLCBSIDw6IFF1YW50aXR5W1RdXSh2YWx1ZTogVCkgZXh0ZW5kcyBRdWFudGl0eVtUXSB7CiAgb3ZlcnJpZGUgdHlwZSBTZWxmID0gUGVyW1QsIFEsIFJdCn0KCmNhc2UgY2xhc3MgUHJvZHVjdENvdW50KHZhbHVlOiBJbnQpIGV4dGVuZHMgUXVhbnRpdHlbSW50XSB7CiAgb3ZlcnJpZGUgdHlwZSBTZWxmID0gUHJvZHVjdENvdW50Cn0KCmNhc2UgY2xhc3MgQm94Q291bnQodmFsdWU6IEludCkgZXh0ZW5kcyBRdWFudGl0eVtJbnRdIHsKICBvdmVycmlkZSB0eXBlIFNlbGYgPSBCb3hDb3VudAp9CgpwYWNrYWdlIG9iamVjdCBjYW5RdWFudGlmaWVzIHsKICBpbXBsaWNpdCB2YWwgcHJvZHVjdENvdW50Q2FuUXVhbnRpZnkgPSBuZXcgQ2FuUXVhbnRpZnlbUHJvZHVjdENvdW50LCBJbnRdIHsKICAgIG92ZXJyaWRlIGRlZiBhcHBseSh2YWx1ZTogSW50KSA9IFByb2R1Y3RDb3VudCh2YWx1ZSkKICB9CgogIGltcGxpY2l0IHZhbCBib3hDb3VudENhblF1YW50aWZ5ID0gbmV3IENhblF1YW50aWZ5W0JveENvdW50LCBJbnRdIHsKICAgIG92ZXJyaWRlIGRlZiBhcHBseSh2YWx1ZTogSW50KSA9IEJveENvdW50KHZhbHVlKQogIH0KfQppbXBvcnQgY2FuUXVhbnRpZmllcy5fCgpvYmplY3QgTWFpbiBleHRlbmRzIEFwcCB7CiAgdmFsIHByb2R1Y3RzID0gUHJvZHVjdENvdW50KDEwKQogIHZhbCBib3hlcyA9IEJveENvdW50KDUpCiAgdmFyIG4gPSBwcm9kdWN0cyAvIGJveGVzCn0=