diff --git a/.travis.yml b/.travis.yml index b161c0c..009d220 100644 --- a/.travis.yml +++ b/.travis.yml @@ -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 diff --git a/src/main/scala/libra/nonsi/package.scala b/src/main/scala/libra/nonsi/package.scala index 642eab0..cff90e0 100644 --- a/src/main/scala/libra/nonsi/package.scala +++ b/src/main/scala/libra/nonsi/package.scala @@ -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] = @@ -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] diff --git a/src/main/scala/libra/ops/base.scala b/src/main/scala/libra/ops/base.scala index 618c9d0..e9864e6 100644 --- a/src/main/scala/libra/ops/base.scala +++ b/src/main/scala/libra/ops/base.scala @@ -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 { @@ -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]] + ):ConversionFactor[A, Angle, From, To] = + new ConversionFactor(fromConversion.value * toConversion.value.value) + } /** Derived typeclass for the conversion factor from F to T