Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deferred object #32

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,6 @@ Still to do
-----------

- Data
- Deferred Object
- Effects (Custom, Sliding)
- Forms
- Internals
Expand Down
2 changes: 2 additions & 0 deletions fay-jquery.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ extra-source-files:
README.md
CHANGELOG.md
data-files: src/JQuery.hs
, src/JQuery/Deferred.hs

source-repository head
type: git
Expand All @@ -26,5 +27,6 @@ library
hs-source-dirs: src
ghc-options: -Wall
exposed-modules: JQuery
, JQuery.Deferred
build-depends: fay-base >= 0.18
, fay-text >= 0.2
7 changes: 3 additions & 4 deletions src/JQuery.hs
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,9 @@ noConflictBool = ffi "jQuery['noConflict'](%1)"

-- TODO: jQuery['when'](): figure out Deferred first

promise :: Defined Text -> Defined a -> JQuery -> Fay JQuery
promise = ffi "%3.promise(%1, %2)"

----
---- CSS
----
Expand Down Expand Up @@ -373,10 +376,6 @@ setWidthWith = ffi "%2['width'](%1)"
---- Data
----

----
---- Deferred Object
----

----
---- Effects
----
Expand Down
107 changes: 107 additions & 0 deletions src/JQuery/Deferred.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
{-# LANGUAGE OverloadedStrings #-}


module JQuery.Deferred where
----
---- Deferred Object
----

---- Assume JQuery > 1.8

import Fay.Text (Text, fromString, pack, unpack)
import FFI

data Deferred t = Deferred t
data DeferredState = Pending | Resolved | Rejected

deferred :: Defined (Deferred t -> Fay ()) -> Fay (Deferred t)
deferred (Defined beforeStart) = (ffi "jQuery.Deferred(%1)" :: (Deferred t -> Fay ()) -> Fay (Deferred t)) beforeStart
deferred Undefined = ffi "jQuery.Deferred()" :: Fay (Deferred t)

always :: Fay ()
-> Deferred t
-> Fay (Deferred t)
always = ffi "%2.always(%1)"

done :: (t -> Fay ())
-> Deferred t
-> Fay (Deferred t)
done = ffi "%2.done(%1)"

fail_ :: Fay ()
-> Deferred t
-> Fay (Deferred t)
fail_ = ffi "%2.fail(%1)"

--notify :: t -> Deferred t -> Fay ()
--notify = ffi "%2.notify(%1)"

-- TODO - store *this* into Deferred
-- notifyWith :: c -> t -> Deferred t -> Fay ()
-- notifyWith = ffi "%3.notify(%1,%2)"

reject :: t -> Deferred t -> Fay (Deferred t)
reject = ffi "%2.reject(%1)"

-- TODO - store *this* into Deferred
rejectWith :: c -> t -> Deferred t -> Fay ()
rejectWith = ffi "%3.rejectWith(%1,%2)"

resolve :: t -> Deferred t -> Fay ()
resolve = ffi "%2.resolve(%1)"

-- TODO - store *this* into Deferred
--resolveWith :: c -> t -> Deferred t -> Fay ()
--resolveWith = ffi "%3.resolveWith(%1,%2)"

-- TODO - Promise not yet implemented. The hidden methods on Promise will fail at runtime ATM
-- TODO - Promise with target untested
promise_ :: Defined target -> Deferred t -> Fay (Deferred t)
promise_ (Defined targ) def = (ffi "%2.promise(%1)" :: target -> Deferred t -> Fay (Deferred t)) targ def
promise_ Undefined def = (ffi "%1.promise()" :: Deferred t -> Fay (Deferred t)) def

--
-- Tested up to here
--

deferredStateToText :: DeferredState -> Text
deferredStateToText ds = case ds of
Pending -> pack "pending" :: Text
Rejected -> pack "rejected" :: Text
Resolved -> pack "resolved" :: Text

-- TODO - the case statement here with the strings as Text does not work, it just chooses the first value
-- I haven't been able to replicate the problem outside of this file though, so I've left it here
state :: Deferred t -> Fay DeferredState
state def = do
stateStr <- (ffi "%1.state()" :: Deferred t -> Fay Text) def
-- (ffi "window.foo = %1" :: Text -> Fay ()) stateStr
-- (ffi "window.bar = %1" :: Text -> Fay ()) resolvedStr
return $ case unpack stateStr of
"pending" -> Pending
"resolved" -> Resolved
"rejected" -> Rejected

-- case stateStr of
-- rejectedStr -> (ffi "console.log(\"rejected\")" :: Fay ())
-- resolvedStr -> (ffi "console.log(\"resolved\")" :: Fay ())
-- pendingStr -> (ffi "console.log(\"pending\")" :: Fay ())
-- return $ case stateStr of
-- pendingStr -> Pending
-- resolvedStr -> Resolved
-- rejectedStr -> Rejected
-- where pendingStr = pack "pending" :: Text
-- resolvedStr = pack "resolved" :: Text
-- rejectedStr = pack "rejected" :: Text

then_ :: Defined (t -> Fay s)
-> Defined (Fay ())
-> Defined (Fay ())
-> Deferred t
-> Fay (Deferred s)
then_ = ffi "%4.then(%1,%2,%3)"

-- Need heterogeneous array to implement this properly
when_ :: [Deferred t] -> Fay (Deferred [t])
when_ = ffi "jQuery.when.apply(jQuery,%1).then(function() { return Array.prototype.slice.call(arguments).sort() })"

Loading