From f7453cd76f5e8c805c85011493a0ba388d7aa7c2 Mon Sep 17 00:00:00 2001 From: Lukasz Drygala Date: Sun, 10 Dec 2017 15:35:47 +0100 Subject: [PATCH 1/5] add implicitly chain for angle conversion factors --- src/main/scala/libra/nonsi/package.scala | 69 ++---------------------- src/main/scala/libra/ops/base.scala | 14 ++++- 2 files changed, 16 insertions(+), 67 deletions(-) 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..5bf0661 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 { @@ -32,6 +32,16 @@ object base { new ConversionFactor(otherConversionFactor.value * value) } + object ConversionFactor { + implicit def inductiveAngelConversionFactor[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 * * Two conversions (from and to) are derived from a single conversion factor From 546139de57bdfdc4466b2d9852ad2c091c0f55fe Mon Sep 17 00:00:00 2001 From: Lukasz Drygala Date: Sun, 10 Dec 2017 21:13:55 +0100 Subject: [PATCH 2/5] install ruby-dep --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b161c0c..444e9f9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,4 @@ -language: scala + language: scala scala: - 2.11.8 - 2.12.1 @@ -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 From fa30477153bae1eee88f4784f992134e62c4508a Mon Sep 17 00:00:00 2001 From: Lukasz Drygala Date: Sun, 10 Dec 2017 21:24:47 +0100 Subject: [PATCH 3/5] fix accidental refactoring --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 444e9f9..009d220 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,4 @@ - language: scala +language: scala scala: - 2.11.8 - 2.12.1 From da231c0996fabe58aa0a1076801eb9fc6adf95c3 Mon Sep 17 00:00:00 2001 From: Lukasz Drygala Date: Wed, 13 Dec 2017 15:36:00 +0100 Subject: [PATCH 4/5] fix typo --- src/main/scala/libra/ops/base.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/libra/ops/base.scala b/src/main/scala/libra/ops/base.scala index 5bf0661..0575033 100644 --- a/src/main/scala/libra/ops/base.scala +++ b/src/main/scala/libra/ops/base.scala @@ -33,7 +33,7 @@ object base { } object ConversionFactor { - implicit def inductiveAngelConversionFactor[A, From <: UnitOfMeasure[Angle], To <: UnitOfMeasure[Angle], Next <: UnitOfMeasure[Angle]]( + 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]] From a296c300943134d10407377787c88e519cdbf87a Mon Sep 17 00:00:00 2001 From: Lukasz Drygala Date: Thu, 14 Dec 2017 13:55:53 +0100 Subject: [PATCH 5/5] remove unused compose function on ConversionFactor --- src/main/scala/libra/ops/base.scala | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/scala/libra/ops/base.scala b/src/main/scala/libra/ops/base.scala index 0575033..e9864e6 100644 --- a/src/main/scala/libra/ops/base.scala +++ b/src/main/scala/libra/ops/base.scala @@ -26,11 +26,7 @@ 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]](