diff --git a/extra/darcs-ui b/extra/darcs-ui index e2554b2eba..8a2deafe64 160000 --- a/extra/darcs-ui +++ b/extra/darcs-ui @@ -1 +1 @@ -Subproject commit e2554b2ebae120bbd315ccbca8aa833bc8cb830e +Subproject commit 8a2deafe64cba990453126befbbbf2eed0ffd8f8 diff --git a/extra/recipes/recipes.factor b/extra/recipes/recipes.factor index 88595b551a..125f187e7f 100644 --- a/extra/recipes/recipes.factor +++ b/extra/recipes/recipes.factor @@ -27,7 +27,7 @@ STORED-TUPLE: recipe { title { VARCHAR 100 } } { votes INTEGER } { txt TEXT } { ] , ] { 350 245 } >>pref-dim ; -:: recipe-browser ( -- ) [ +:: recipe-browser ( -- ) [ [ interface :> tbl "okay" BUTTON -> :> ok @@ -56,6 +56,6 @@ STORED-TUPLE: recipe { title { VARCHAR 100 } } { votes INTEGER } { txt TEXT } { [ [ 1 ] <$ ] [ quot ok #1 [ call( recipe -- ) 0 ] 2fmap-& ] bi 2array 0 >>model - ] with-interface "recipes" open-window ; + ] with-interface "recipes" open-window ] with-ui ; MAIN: recipe-browser \ No newline at end of file diff --git a/extra/ui/frp/signals/signals.factor b/extra/ui/frp/signals/signals.factor index b5389f7bb9..4db526dbb3 100644 --- a/extra/ui/frp/signals/signals.factor +++ b/extra/ui/frp/signals/signals.factor @@ -30,6 +30,7 @@ IN: ui.frp.signals TUPLE: basic-model < multi-model ; M: basic-model (model-changed) [ value>> ] dip set-model ; : ( models -- signal ) basic-model ; +: <2merge> ( model1 model2 -- signal ) 2array ; : ( value -- signal ) basic-model new-model ; TUPLE: filter-model < multi-model quot ; @@ -37,11 +38,18 @@ M: filter-model (model-changed) [ value>> ] dip 2dup quot>> call( a -- ? ) [ set-model ] [ 2drop ] if ; : ( model quot -- filter-signal ) [ 1array filter-model ] dip >>quot ; -TUPLE: fold-model < multi-model quot ; -M: fold-model (model-changed) [ [ value>> ] [ [ value>> ] [ quot>> ] bi ] bi* - call( val oldval -- newval ) ] keep set-model ; -: ( model oldval quot -- signal ) rot 1array fold-model swap >>quot +TUPLE: fold-model < multi-model quot base values ; +M: fold-model (model-changed) 2dup base>> = + [ [ [ value>> ] [ [ values>> ] [ quot>> ] bi ] bi* swapd reduce* ] keep set-model ] + [ [ [ value>> ] [ values>> ] bi* push ] + [ [ [ value>> ] [ [ value>> ] [ quot>> ] bi ] bi* call( val oldval -- newval ) ] keep set-model ] 2bi + ] if ; +M: fold-model model-activated drop ; +: new-fold-model ( deps -- model ) fold-model V{ } clone >>values ; +: ( model oldval quot -- signal ) rot 1array new-fold-model swap >>quot swap >>value ; +: ( model oldmodel quot -- signal ) over [ [ 2array new-fold-model ] dip >>quot ] + dip [ >>base ] [ value>> >>value ] bi ; TUPLE: updater-model < multi-model values updates ; M: updater-model (model-changed) tuck updates>> = @@ -105,4 +113,7 @@ PRIVATE> M: model >>= [ swap ] curry ; M: model fmap ; USE: ui.frp.functors -FMAPS: $> <$ fmap FOR & | product ; \ No newline at end of file +FMAPS: $> <$ fmap FOR & | product ; + +! only used in construction +: with-self ( quot: ( model -- model ) -- model ) [ f dup ] dip call swap [ add-dependency ] keep ; inline \ No newline at end of file