From 66602c9dd78deafad117301db652b5271d7c70d0 Mon Sep 17 00:00:00 2001 From: Paul Chiusano Date: Fri, 12 Dec 2014 15:37:08 -0500 Subject: [PATCH] Using common movement manipulation functions --- editor/Elmz/Signal.elm | 3 +++ editor/Main.elm | 20 ++++++-------------- editor/Unison/Scope.elm | 11 +++++++++++ 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/editor/Elmz/Signal.elm b/editor/Elmz/Signal.elm index 7fb9f09d7..48f2e52df 100644 --- a/editor/Elmz/Signal.elm +++ b/editor/Elmz/Signal.elm @@ -123,6 +123,9 @@ toggle s = let t = lift (always True) s in xor <~ t ~ delay False t +tuple2 : Signal a -> Signal b -> Signal (a,b) +tuple2 s s2 = (,) <~ s ~ s2 + {-| Spikes `False` for one tick when `a` event fires, otherwise is `True`. -} unchanged : Signal a -> Signal Bool unchanged a = lift not (changed a) diff --git a/editor/Main.elm b/editor/Main.elm index aa0f91d7b..54fb5ba2c 100644 --- a/editor/Main.elm +++ b/editor/Main.elm @@ -72,20 +72,12 @@ full = E.Lit (E.Distance (Distance.Fraction 1.0)) resolvedPath : Signal E.Term -> Signal (Maybe Path) -> Signal (Maybe Scope) resolvedPath e pathUnderPtr = - let nonzero {x,y} = x /= 0 || y /= 0 - edit {x,y} e = - (if y == 1 then Scope.up else identity) >> - (if y == -1 then Scope.down e else identity) >> - (if x == 1 then Scope.right e else identity) >> - (if x == -1 then Scope.left e else identity) - edits = edit <~ Signals.repeatAfterIf (300*millisecond) 20 nonzero Keyboard.arrows ~ e - defaultScope = lift (Maybe.map Scope.scope) pathUnderPtr - shifted = Signals.foldpBetween' - Mouse.position - (\edit p -> Maybe.map edit p) - defaultScope - edits - in Signals.fromMaybe defaultScope shifted + let defaultScope = lift (Maybe.map Scope.scope) pathUnderPtr + shifted = Movement.moveD2 Scope.movements + Mouse.position + (Signals.tuple2 e defaultScope) + (Movement.repeatD2 (Movement.d2' Keyboard.arrows)) + in Signals.fromMaybe defaultScope (Maybe.map snd <~ shifted) terms : Signal E.Term terms = constant expr diff --git a/editor/Unison/Scope.elm b/editor/Unison/Scope.elm index 5c0e25543..0c473447e 100644 --- a/editor/Unison/Scope.elm +++ b/editor/Unison/Scope.elm @@ -1,5 +1,6 @@ module Unison.Scope where +import Maybe import Unison.Path as Path import Unison.Term (Term) @@ -36,3 +37,13 @@ right e {focus,ups,downs} = let p = Term.siblingR e focus in if p == focus then Scope focus ups downs else Scope p [] [] + +movements : { up : (Term, Maybe Scope) -> (Term, Maybe Scope) + , down : (Term, Maybe Scope) -> (Term, Maybe Scope) + , left : (Term, Maybe Scope) -> (Term, Maybe Scope) + , right : (Term, Maybe Scope) -> (Term, Maybe Scope) } +movements = + { up (e,s) = (e, Maybe.map up s) + , down (e,s) = (e, Maybe.map (down e) s) + , left (e,s) = (e, Maybe.map (left e) s) + , right (e,s) = (e, Maybe.map (right e) s) }