Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ install:
- rvm use 2.2.3 --install --fuzzy
- gem update --system
- gem install sass
- gem install ruby_dep -v 1.3.1
- gem install jekyll -v 3.2.1
before_script:
- if [ $TRAVIS_PULL_REQUEST = 'false' ]; then git checkout -qf $TRAVIS_BRANCH; fi
Expand Down
69 changes: 4 additions & 65 deletions src/main/scala/libra/nonsi/package.scala
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,6 @@ package object nonsi {
implicit def gradian: Show[Gradian] = Show[Gradian]("gon")
implicit def turn: Show[Turn] = Show[Turn]("tr")

implicit def degreeArcminuteConversion[A](
implicit c: ConvertableTo[A]
): ConversionFactor[A, Angle, Degree, Arcminute] =
new ConversionFactor(c.fromInt(60))

implicit def degreeArcsecondConversion[A](
implicit c: ConvertableTo[A]
): ConversionFactor[A, Angle, Degree, Arcsecond] =
new ConversionFactor(c.fromInt(3600))

implicit def arcminuteArcsecondConversion[A](
implicit c: ConvertableTo[A]
): ConversionFactor[A, Angle, Arcminute, Arcsecond] =
Expand All @@ -52,72 +42,21 @@ package object nonsi {
): ConversionFactor[A, Angle, Radian, Degree] =
new ConversionFactor(c.fromDouble(180.0 / pi))

implicit def radianArcminuteConversion[A](
implicit c: ConvertableTo[A],
multiplicative: MultiplicativeSemigroup[A]
): ConversionFactor[A, Angle, Radian, Arcminute] =
degreeArcminuteConversion.compose(radianDegreeConversion)

implicit def radianArcsecondConversion[A](
implicit c: ConvertableTo[A],
multiplicative: MultiplicativeSemigroup[A]
): ConversionFactor[A, Angle, Radian, Arcsecond] =
degreeArcsecondConversion.compose(radianDegreeConversion)
implicit def degreeArcminuteConversion[A](
implicit c: ConvertableTo[A]
): ConversionFactor[A, Angle, Degree, Arcminute] =
new ConversionFactor(c.fromInt(60))

implicit def gradianRadianConversion[A](
implicit c: ConvertableTo[A]
): ConversionFactor[A, Angle, Gradian, Radian] =
new ConversionFactor(c.fromDouble(pi / 200.0))

implicit def gradianDegreeConversion[A](
implicit c: ConvertableTo[A],
multiplicative: MultiplicativeSemigroup[A]
): ConversionFactor[A, Angle, Gradian, Degree] =
radianDegreeConversion.compose(gradianRadianConversion)

implicit def gradianArcminuteConversion[A](
implicit c: ConvertableTo[A],
multiplicative: MultiplicativeSemigroup[A]
): ConversionFactor[A, Angle, Gradian, Arcminute] =
radianArcminuteConversion.compose(gradianRadianConversion)

implicit def gradianArcsecondConversion[A](
implicit c: ConvertableTo[A],
multiplicative: MultiplicativeSemigroup[A]
): ConversionFactor[A, Angle, Gradian, Arcsecond] =
radianArcsecondConversion.compose(gradianRadianConversion)

implicit def turnGradianConversion[A](
implicit c: ConvertableTo[A]
): ConversionFactor[A, Angle, Turn, Gradian] =
new ConversionFactor(c.fromInt(400))

implicit def turnRadianConversion[A](
implicit c: ConvertableTo[A],
multiplicative: MultiplicativeSemigroup[A]
): ConversionFactor[A, Angle, Turn, Radian] =
gradianRadianConversion.compose(turnGradianConversion)

implicit def turnDegreeConversion[A](
implicit c: ConvertableTo[A],
multiplicative: MultiplicativeSemigroup[A]
): ConversionFactor[A, Angle, Turn, Degree] =
gradianDegreeConversion.compose(turnGradianConversion)

implicit def turnArcminuteConversion[A](
implicit c: ConvertableTo[A],
multiplicative: MultiplicativeSemigroup[A]
): ConversionFactor[A, Angle, Turn, Arcminute] =
gradianArcminuteConversion.compose(turnGradianConversion)

implicit def turnArcsecondConversion[A](
implicit c: ConvertableTo[A],
multiplicative: MultiplicativeSemigroup[A]
): ConversionFactor[A, Angle, Turn, Arcsecond] =
gradianArcsecondConversion.compose(turnGradianConversion)



type AngularVelocityQuantity[A, L <: UnitOfMeasure[Angle], T <: UnitOfMeasure[Time]] =
Quantity[A, Term[Angle, L, Fraction[1, 1]] :: Term[Time, T, Fraction[-1, 1]] :: HNil]

Expand Down
18 changes: 12 additions & 6 deletions src/main/scala/libra/ops/base.scala
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package libra
package ops

import libra.UnitOfMeasure
import libra.nonsi.Angle
import shapeless.Lazy
import spire.algebra._
import spire.implicits._
import spire.math.ConvertableFrom

object base {

Expand All @@ -26,10 +26,16 @@ object base {
* @tparam F the unit to convert from
* @tparam T the unit to convert to
*/
case class ConversionFactor[A, D, F <: UnitOfMeasure[D], T <: UnitOfMeasure[D]](val value: A) {
def compose[OtherF <: UnitOfMeasure[D]](otherConversionFactor: ConversionFactor[A, D, OtherF, F])
(implicit multiplicativeSemigroup: MultiplicativeSemigroup[A]): ConversionFactor[A, D, OtherF, T] =
new ConversionFactor(otherConversionFactor.value * value)
case class ConversionFactor[A, D, F <: UnitOfMeasure[D], T <: UnitOfMeasure[D]](val value: A)

object ConversionFactor {
implicit def inductiveAngleConversionFactor[A, From <: UnitOfMeasure[Angle], To <: UnitOfMeasure[Angle], Next <: UnitOfMeasure[Angle]](
implicit multiplicativeSemigroup: MultiplicativeSemigroup[A],
fromConversion: ConversionFactor[A, Angle, From, Next],
toConversion: Lazy[ConversionFactor[A, Angle, Next, To]]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

):ConversionFactor[A, Angle, From, To] =
new ConversionFactor(fromConversion.value * toConversion.value.value)

}

/** Derived typeclass for the conversion factor from F to T
Expand Down