Skip to content

Commit 053df57

Browse files
committed
Initial commit
0 parents  commit 053df57

File tree

11 files changed

+162
-0
lines changed

11 files changed

+162
-0
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/bower_components/
2+
/node_modules/
3+
/output/
4+
/.psci*
5+
/src/.webpack.js

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# purescript-cycle
2+
3+
Bindings for Cycle.js.
4+
Very straightforward, quite ill-typed.
5+
6+
See `src/Main.purs` for simple example (yeah, it's a counter).

bower.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"name": "purescript-cycle",
3+
"moduleType": [
4+
"node"
5+
],
6+
"ignore": [
7+
"**/.*",
8+
"node_modules",
9+
"bower_components",
10+
"output"
11+
],
12+
"dependencies": {
13+
"purescript-rx": "~0.8.1",
14+
"purescript-halogen": "~0.5.8"
15+
}
16+
}

index.html

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="utf-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
6+
<meta name="description" content="Cycle.js example - Hello World"/>
7+
<title>Cycle.js example - Counter</title>
8+
</head>
9+
<body>
10+
<div id="app"></div>
11+
<script src="./app.js"></script>
12+
<script src="/webpack-dev-server.js"></script>
13+
</body>
14+
</html>

package.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"name": "purescript-cycle",
3+
"description": "Purescript bindings for cycle.js",
4+
"main": "index.js",
5+
"directories": {
6+
"test": "test"
7+
},
8+
"scripts": {
9+
"test": "echo \"Error: no test specified\" && exit 1"
10+
},
11+
"author": "Konstantin Zudov <co@zudov.me>",
12+
"license": "BSD3",
13+
"dependencies": {
14+
"@cycle/core": "6.0.0-rc2",
15+
"@cycle/dom": "8.0.0-rc4",
16+
"rx": "^4.0.7",
17+
"virtual-dom": "^2.1.1"
18+
}
19+
}

src/Cycle.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// module Cycle
2+
const Cycle = require('@cycle/core');
3+
4+
exports.run =
5+
function(main) {
6+
return function(drivers) {
7+
return function() {
8+
Cycle.run(main, drivers);
9+
}
10+
}
11+
}

src/Cycle.purs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module Cycle where
2+
3+
import Prelude (Unit())
4+
5+
import Control.Monad.Eff (Eff())
6+
7+
foreign import run :: forall inputs outputs eff.
8+
({ | inputs } -> { | outputs }) -> { | inputs } -> Eff eff Unit

src/Cycle/Dom.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// module Cycle.Dom
2+
const CycleDOM = require('@cycle/dom')
3+
4+
exports.makeDomDriver = CycleDOM.makeDOMDriver
5+
6+
exports.select =
7+
function(selector) {
8+
return function(driver) {
9+
return driver.select(selector);
10+
}
11+
}
12+
13+
exports.events =
14+
function(eventType) {
15+
return function(elements) {
16+
return elements.events(eventType);
17+
}
18+
}

src/Cycle/Dom.purs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
module Cycle.Dom where
2+
3+
import Prelude hiding (div)
4+
5+
import Data.Void (Void())
6+
import Data.Identity (Identity(), runIdentity)
7+
8+
import DOM.Event.Types (Event())
9+
import Rx.Observable (Observable())
10+
11+
import Halogen.Internal.VirtualDOM (VTree())
12+
import Halogen.HTML.Core (HTML())
13+
import Halogen.HTML.Renderer.VirtualDOM as Renderer
14+
15+
type CycleHTML = HTML Void (Identity Unit)
16+
17+
renderHTML :: CycleHTML -> VTree
18+
renderHTML = Renderer.renderHTML (pure <<< runIdentity)
19+
20+
foreign import data DomDriver :: *
21+
22+
foreign import makeDomDriver :: String -> DomDriver
23+
24+
foreign import data Selection :: *
25+
26+
foreign import select :: String -> DomDriver -> Selection
27+
foreign import events :: String -> Selection -> Observable Event

src/Main.purs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
module Main where
2+
3+
import Prelude
4+
5+
import Cycle
6+
import Cycle.Dom
7+
import Rx.Observable
8+
9+
import Halogen.HTML as H
10+
import Halogen.HTML.Properties as P
11+
12+
import Halogen.Internal.VirtualDOM (VTree())
13+
14+
main = run app drivers
15+
16+
app :: { dom :: DomDriver } -> { dom :: Observable VTree }
17+
app requests = { dom: map (renderHTML <<< render) count }
18+
where
19+
clicks = requests.dom # select "#count" # events "click"
20+
count = clicks # map (const 1)
21+
# startWith 0
22+
# scan (+) 0
23+
render state = H.div_
24+
[ H.button
25+
[ P.id_ "count" ]
26+
[ H.text "Click me" ]
27+
, H.div_
28+
[ H.text (show state) ]
29+
]
30+
31+
drivers :: { dom :: DomDriver }
32+
drivers = { dom: makeDomDriver "#app" }

0 commit comments

Comments
 (0)