Skip to content

Commit 0b4d1ce

Browse files
committed
Fix #1, example
1 parent 813b494 commit 0b4d1ce

File tree

5 files changed

+50
-20
lines changed

5 files changed

+50
-20
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44
/output/
55
/node_modules/
66
/bower_components/
7-
/tmp/
7+
/dist/

Gruntfile.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,23 @@ module.exports = function(grunt) {
1717
}
1818
},
1919

20+
psc: {
21+
options: {
22+
modules: ["Main"],
23+
main: "Main"
24+
},
25+
example: {
26+
src: ["<%=libFiles%>", "examples/*.purs"],
27+
dest: "dist/Main.js"
28+
}
29+
},
30+
2031
dotPsci: ["<%=libFiles%>"]
2132
});
2233

2334
grunt.loadNpmTasks("grunt-contrib-clean");
2435
grunt.loadNpmTasks("grunt-purescript");
2536

26-
grunt.registerTask("make", ["pscMake:lib", "dotPsci"]);
37+
grunt.registerTask("make", ["pscMake:lib", "dotPsci", "psc:example"]);
2738
grunt.registerTask("default", ["clean", "make"]);
2839
};

bower.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,5 @@
1818
"purescript-arrays" : "*",
1919
"purescript-tuples" : "*",
2020
"purescript-maybe" : "*"
21-
},
22-
"devDependencies": {
23-
"purescript-quickcheck" : "*"
2421
}
2522
}

examples/Collatz.purs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
module Main where
2+
3+
import Data.Tuple
4+
import Data.Maybe
5+
import Data.Array
6+
import Data.Unfoldable
7+
8+
import Debug.Trace
9+
10+
collatz :: Number -> [Number]
11+
collatz = unfoldr step
12+
where
13+
step 1 = Nothing
14+
step n = Just $ Tuple n $ if n % 2 == 0 then n / 2 else n * 3 + 1
15+
16+
main = print $ collatz 1000

src/Data/Unfoldable.purs

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,30 @@ module Data.Unfoldable where
22

33
import Data.Maybe
44
import Data.Tuple
5-
import Data.Function
5+
import Control.Monad.Eff
6+
import Control.Monad.ST
67

78
class Unfoldable t where
89
unfoldr :: forall a b. (b -> Maybe (Tuple a b)) -> b -> t a
910

10-
foreign import unfoldrArray
11-
"function unfoldrArray(f, b) {\
12-
\ var result = [];\
13-
\ while (true) {\
14-
\ var maybe = f(b);\
15-
\ if (maybe.ctor === \"Data.Maybe.Nothing\") {\
16-
\ return result;\
17-
\ } else if (maybe.ctor === \"Data.Maybe.Just\") {\
18-
\ result.push(maybe.values[0].values[0]);\
19-
\ b = maybe.values[0].values[1];\
20-
\ }\
21-
\ }\
22-
\}" :: forall a b. Fn2 (b -> Maybe (Tuple a b)) b [a]
11+
foreign import newEmptySTArray
12+
"function newEmptySTArray() {\
13+
\ return [];\
14+
\}" :: forall eff h a. Eff (st :: ST h | eff) (STArray h a)
2315

2416
instance unfoldableArray :: Unfoldable [] where
25-
unfoldr = runFn2 unfoldrArray
17+
unfoldr f b = runPure (runSTArray (do
18+
arr <- newEmptySTArray
19+
seed <- newSTRef b
20+
idx <- newSTRef 0
21+
untilE $ do
22+
b1 <- readSTRef seed
23+
case f b1 of
24+
Nothing -> return true
25+
Just (Tuple a b2) -> do
26+
i <- readSTRef idx
27+
pokeSTArray arr i a
28+
writeSTRef seed b2
29+
writeSTRef idx (i + 1)
30+
return false
31+
return arr))

0 commit comments

Comments
 (0)