Skip to content

Instantly share code, notes, and snippets.

@wuxianliang
Forked from brainrake/furp.ls
Created August 22, 2013 11:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wuxianliang/6306034 to your computer and use it in GitHub Desktop.
Save wuxianliang/6306034 to your computer and use it in GitHub Desktop.
import prelude
Signal = -> new (class SignalClass
(register) ->
@handlers = []
register @send
send: (value) ~>
@_value = value
for handler in @handlers => handler value
@_memo = value
new: (adder) ~>
Signal (send) ~>
@handlers.push adder send
lift: (fn) ~>
@new (send) -> (value) ->
send fn value
keep-if: (test) ~>
@new (send) -> (value) ~>
if test value then send value
when-true: ~> @keep-if -> it
foldp: (def, fn) ~>
signal = @new (send) -> (value) ->
send (fn value, signal._memo ? def)
drop-repeats: (def) ~>
signal = @keep-if (value) ~>
signal._memo != value
count: ~>
@foldp 0, (value, memo) ->
memo + 1
delay: (ms) ~>
@new (send) -> (value) ->
_.delay (-> send value), ms
throttle: (ms) ~>
@new (send) ->
_.throttle ((value) -> send value), ms
latch: (ms) ~>
signal = @new (send) ->
send-false = _.debounce (-> send false), ms
(value) -> send true; send-false()
signal.drop-repeats()
sample-on: (signal) ~>
@new (send) ~>
signal.lift ~> send @_value
->
)(...arguments) # use Signal constructor without 'new'
DomInput = (event, el = document) ->
Signal (send) ~> $ el .on event, send
class Keyboard
@isDown = (keyCode) ->
updown = Signal (send) ->
reg = (event) -> DomInput event .keep-if (event) ->
event.keyCode == keyCode
reg \keydown .lift -> send true
reg \keyup .lift -> send false
updown.drop-repeats()
@arrows = ->
class Mouse
@position =
Signal (send) ->
for event in <[ mousemove mousedown mouseup ]>
DomInput event
.lift -> send x: it.clientX, y: it.clientY
@isDown =
Signal (send) ->
DomInput \mousedown .lift -> send true
DomInput \mouseup .lift -> send false
@isClicked =
Signal (send) ->
DomInput \click .lift -> send true; send false
@clicks =
Mouse.isClicked.when-true()
# examples
__ = -> console.log ...arguments; it
Mouse.position
.sample-on Mouse.clicks
.lift -> __ 'mouse position on click', it
Mouse.position
.latch 1000
.lift ->
if it is true => __ 'mouse is active'
else __ 'mouse is inactive: not moved in 1 sec'
Keyboard.isDown 32
.keep-true()
.delay 500
.count()
.lift -> __ 'space presses (delayed): ', it
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script src="components/prelude-ls/prelude-browser.js"></script>
<script src="components/underscore/underscore.js"></script>
<script src="components/jquery/jquery.js"></script>
<script src="furp.js"></script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment