From 23212dfde8c25f1e610cc5ef076a89cba46ee251 Mon Sep 17 00:00:00 2001 From: Sarah Gerweck Date: Fri, 1 May 2015 19:28:25 -0700 Subject: [PATCH] WIP of tupler update. --- .../scalafx/util/ObservableTupler.scala | 55 +++++++------------ 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/src/main/scala/org/gerweck/scalafx/util/ObservableTupler.scala b/src/main/scala/org/gerweck/scalafx/util/ObservableTupler.scala index 406481e..e261347 100644 --- a/src/main/scala/org/gerweck/scalafx/util/ObservableTupler.scala +++ b/src/main/scala/org/gerweck/scalafx/util/ObservableTupler.scala @@ -15,6 +15,7 @@ import Scalaz._ import shapeless._ import shapeless.syntax._ import shapeless.ops.hlist._ +import shapeless.ops.function._ import scalafx.beans.property.ObjectProperty import scalafx.beans.value.ObservableValue @@ -32,38 +33,6 @@ class ObservableTupler tupler: Tupler.Aux[HLParams, TParams], lister: ToList[HLObs, Observable[_]]) { - def ap[O, P, Appended <: HList] - (f: ObservableValue[O, P]) - (implicit prepend: Prepend.Aux[HLObs, ObservableValue[O, P]::HNil, Appended]) = { - hlist :+ f - } - - def uw[O, P, Appended <: HList, Unwrapped <: HList] - (f: ObservableValue[O, P]) - (implicit prepend: Prepend.Aux[HLObs, ObservableValue[O, P]::HNil, Appended], - uw: Mapper.Aux[ObservableUnwrapper.type, Appended, Unwrapped]): Unwrapped = { - uw(hlist :+ f) - } - - def tp[O, P, Appended <: HList, Unwrapped <: HList, Tupled <: Product] - (f: ObservableValue[O, P]) - (implicit prepend: Prepend.Aux[HLObs, ObservableValue[O, P]::HNil, Appended], - uw: Mapper.Aux[ObservableUnwrapper.type, Appended, Unwrapped], - tplr: Tupler.Aux[Unwrapped, Tupled]): Tupled = { - uw(hlist :+ f).tupled - } - - def tl[O, P, Appended <: HList, Unwrapped <: HList, Tupled <: Product, ApList] - (f: ObservableValue[O, P]) - (implicit prepend: Prepend.Aux[HLObs, ObservableValue[O, P]::HNil, Appended], - uw: Mapper.Aux[ObservableUnwrapper.type, Appended, Unwrapped], - tplr: Tupler.Aux[Unwrapped, Tupled], - lst: ToList[Appended, Observable[_]]): Tupled = { - val hl = hlist :+ f - hl.toList - uw(hl).tupled - } - def |@|[O, P, Appended <: HList, Unwrapped <: HList, Tupled <: Product, ApList] (f: ObservableValue[O, P]) (implicit prepend: Prepend.Aux[HLObs, ObservableValue[O, P]::HNil, Appended], @@ -74,6 +43,21 @@ class ObservableTupler new ObservableTupler[Appended, Unwrapped, Tupled](newHL) } + def hlisted: ObservableValue[HLParams, HLParams] = { + def calculate() = unwrapper(hlist) + val original = calculate() + val prop = ObjectProperty[HLParams](original) + + for { + component <- hlist.toList + } { + component onChange { + prop.value = calculate() + } + } + prop + } + def tupled: ObservableValue[TParams, TParams] = { def calculate() = unwrapper(hlist).tupled @@ -90,7 +74,11 @@ class ObservableTupler prop } - def apply[C](f: TParams => C): Observable[C] = tupled map f + def apply[Func, Result](f: Func)(implicit ffp: FnFromProduct.Aux[HLParams => Result, Func], ftp: FnToProduct.Aux[Func, HLParams => Result]): ObservableValue[Result, Result] = { + hlisted map ftp(f) + } + +// def apply[C](f: TParams => C): Observable[C] = tupled map f } object ObservableUnwrapper extends Poly1 { @@ -98,7 +86,6 @@ object ObservableUnwrapper extends Poly1 { } object ObservableTupler { - def apply[A, A1, B, B1](a: ObservableValue[A, A1], b: ObservableValue[B, B1]) = { new ObservableTupler(a::b::HNil) }