Using common movement manipulation functions

This commit is contained in:
Paul Chiusano 2014-12-12 15:37:08 -05:00
parent 26b66e9752
commit 66602c9dd7
3 changed files with 20 additions and 14 deletions

View File

@ -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)

View File

@ -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

View File

@ -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) }