git.iko.soy/purescript-indexed-DB
on master help sign in
upgrade to latest purescript-aff
commit6312c7cfb449d96a395f45b0a1aa65ac8960ae82 authorKtorZ <matthias.benkort@gmail.com> dateTue 13 Mar 2018, 20:36 (9 years ago) parent58f9bd0
15 files changed+377−201
README.md+23−4 bower.json+8−6 src/Database/IndexedDB/IDBCursor.js+35−7 src/Database/IndexedDB/IDBCursor.purs+17−16 src/Database/IndexedDB/IDBDatabase.js+43−9 src/Database/IndexedDB/IDBDatabase.purs+18−17 src/Database/IndexedDB/IDBFactory.js+11−2 src/Database/IndexedDB/IDBFactory.purs+11−10 src/Database/IndexedDB/IDBIndex.js+31−7 src/Database/IndexedDB/IDBIndex.purs+14−13 src/Database/IndexedDB/IDBObjectStore.js+35−7 src/Database/IndexedDB/IDBObjectStore.purs+16−15 src/Database/IndexedDB/IDBTransaction.js+25−5 src/Database/IndexedDB/IDBTransaction.purs+12−12 test/Main.purs+78−71
README.md+23−4
@@ -14,8 +14,27 @@ menaingful namespace (e.g `IDBIndex.get`, `IDBObjectStore.openCursor` ...)
1414
1515Here's a quick example of what it look likes.
1616```purescript
17+module Main where
18+
19+import Prelude
20+
21+import Control.Monad.Aff (Aff, launchAff_)
22+import Control.Monad.Aff.Console (CONSOLE, log)
23+import Control.Monad.Eff.Exception (EXCEPTION)
24+import Control.Monad.Eff (Eff)
25+import Data.Maybe (Maybe(..), maybe)
26+
27+import Database.IndexedDB.Core
28+import Database.IndexedDB.IDBFactory as IDBFactory
29+import Database.IndexedDB.IDBDatabase as IDBDatabase
30+import Database.IndexedDB.IDBObjectStore as IDBObjectStore
31+import Database.IndexedDB.IDBIndex as IDBIndex
32+import Database.IndexedDB.IDBTransaction as IDBTransaction
33+import Database.IndexedDB.IDBKeyRange as IDBKeyRange
34+
35+
1736main :: Eff (idb :: IDB, exception :: EXCEPTION, console :: CONSOLE) Unit
18−main = launchAff' do
37+main = launchAff_ do
1938 db <- IDBFactory.open "db" Nothing { onBlocked : Nothing
2039 , onUpgradeNeeded : Just onUpgradeNeeded
2140 }
@@ -27,11 +46,11 @@ main = launchAff' do
2746
2847
2948onUpgradeNeeded :: forall e. Database -> Transaction -> { oldVersion :: Int } -> Eff (idb :: IDB, exception :: EXCEPTION | e) Unit
30−onUpgradeNeeded db _ _ = launchAff' do
31− store <- IDBDatabase.createObjectStore db "store" IDBObjectStore.defaultParameters
49+onUpgradeNeeded db _ _ = launchAff_ do
50+ store <- IDBDatabase.createObjectStore db "store" IDBDatabase.defaultParameters
3251 _ <- IDBObjectStore.add store "patate" (Just 1)
3352 _ <- IDBObjectStore.add store { property: 42 } (Just 2)
34− _ <- IDBObjectStore.createIndex store "index" ["property"] IDBIndex.defaultParameters
53+ _ <- IDBObjectStore.createIndex store "index" ["property"] IDBObjectStore.defaultParameters
3554 pure unit
3655```
3756
bower.json+8−6
@@ -3,7 +3,7 @@
33 "description": "An API wrapper around IndexedDB",
44 "version": "3.0.0",
55 "authors": [
6− "Matthias Benkort <matthias.benkort@truqu.com>"
6+ "Matthias Benkort <matthias.benkort@gmail.com>"
77 ],
88 "ignore": [
99 "**/.*",
@@ -25,18 +25,20 @@
2525 "url": "git://github.com/truqu/purescript-indexedDB.git"
2626 },
2727 "dependencies": {
28− "purescript-aff": "^3.1.0",
28+ "purescript-aff": "^4.0.2",
2929 "purescript-datetime": "^3.2.0",
3030 "purescript-eff": "^3.1.0",
31− "purescript-exceptions": "^3.1.0",
31+ "purescript-exceptions": "^3.0.0",
32+ "purescript-foreign": "^4.0.1",
3233 "purescript-maybe": "^3.0.0",
34+ "purescript-nullable": "^3.0.0",
3335 "purescript-prelude": "^3.1.0",
3436 "purescript-read": "^1.0.0"
3537 },
3638 "devDependencies": {
37− "purescript-spec": "^1.0.0",
38− "purescript-psci-support": "^3.0.0",
3939 "purescript-now": "^3.0.0",
40− "purescript-spec-mocha": "https://github.com/truqu/purescript-spec-mocha.git#0.5.0"
40+ "purescript-psci-support": "^3.0.0",
41+ "purescript-spec": "^2.0.0",
42+ "purescript-spec-mocha": "^2.0.0"
4143 }
4244}
src/Database/IndexedDB/IDBCursor.js+35−7
@@ -11,40 +11,52 @@ const successHandler = function successHandler(cb) {
1111};
1212
1313exports._advance = function _advance(cursor, count) {
14− return function aff(success, error) {
14+ return function aff(error, success) {
1515 try {
1616 cursor.advance(count);
1717 success();
1818 } catch (e) {
1919 error(e);
2020 }
21+
22+ return function canceler(_, cancelerError) {
23+ cancelerError(new Error("Can't cancel IDB Effects"));
24+ };
2125 };
2226};
2327
2428exports._continue = function _continue(cursor, key) {
25− return function aff(success, error) {
29+ return function aff(error, success) {
2630 try {
2731 cursor.continue(key || undefined);
2832 success();
2933 } catch (e) {
3034 error(e);
3135 }
36+
37+ return function canceler(_, cancelerError) {
38+ cancelerError(new Error("Can't cancel IDB Effects"));
39+ };
3240 };
3341};
3442
3543exports._continuePrimaryKey = function _continuePrimaryKey(cursor, key, primaryKey) {
36− return function aff(success, error) {
44+ return function aff(error, success) {
3745 try {
3846 cursor.continuePrimaryKey(key, primaryKey);
3947 success();
4048 } catch (e) {
4149 error(e);
4250 }
51+
52+ return function canceler(_, cancelerError) {
53+ cancelerError(new Error("Can't cancel IDB Effects"));
54+ };
4355 };
4456};
4557
4658exports._delete = function _delete(cursor) {
47− return function aff(success, error) {
59+ return function aff(error, success) {
4860 try {
4961 const request = cursor.delete();
5062 request.onsuccess = successHandler(success);
@@ -52,6 +64,10 @@ exports._delete = function _delete(cursor) {
5264 } catch (e) {
5365 error(e);
5466 }
67+
68+ return function canceler(_, cancelerError) {
69+ cancelerError(new Error("Can't cancel IDB Effects"));
70+ };
5571 };
5672};
5773
@@ -60,22 +76,30 @@ exports._direction = function _direction(fromString, cursor) {
6076};
6177
6278exports._key = function _key(cursor) {
63− return function aff(success, error) {
79+ return function aff(error, success) {
6480 try {
6581 success(cursor.key);
6682 } catch (e) {
6783 error(e);
6884 }
85+
86+ return function canceler(_, cancelerError) {
87+ cancelerError(new Error("Can't cancel IDB Effects"));
88+ };
6989 };
7090};
7191
7292exports._primaryKey = function _primaryKey(cursor) {
73− return function aff(success, error) {
93+ return function aff(error, success) {
7494 try {
7595 success(cursor.primaryKey);
7696 } catch (e) {
7797 error(e);
7898 }
99+
100+ return function canceler(_, cancelerError) {
101+ cancelerError(new Error("Can't cancel IDB Effects"));
102+ };
79103 };
80104};
81105
@@ -100,7 +124,7 @@ exports._source = function _source(IDBObjectStore, IDBIndex, cursor) {
100124};
101125
102126exports._update = function _update(cursor, value) {
103− return function aff(success, error) {
127+ return function aff(error, success) {
104128 try {
105129 const request = cursor.update(value);
106130 request.onsuccess = successHandler(success);
@@ -108,6 +132,10 @@ exports._update = function _update(cursor, value) {
108132 } catch (e) {
109133 error(e);
110134 }
135+
136+ return function canceler(_, cancelerError) {
137+ cancelerError(new Error("Can't cancel IDB Effects"));
138+ };
111139 };
112140};
113141
src/Database/IndexedDB/IDBCursor.purs+17−16
@@ -16,9 +16,10 @@ module Database.IndexedDB.IDBCursor
1616 , value
1717 ) where
1818
19−import Prelude (Unit, ($), (>>>), map)
19+import Prelude (Unit, ($), (>>>), (<<<), map)
2020
2121import Control.Monad.Aff (Aff)
22+import Control.Monad.Aff.Compat (fromEffFnAff, EffFnAff)
2223import Data.Foreign (Foreign, toForeign, unsafeFromForeign)
2324import Data.Function.Uncurried as Fn
2425import Data.Function.Uncurried (Fn2, Fn3)
@@ -40,8 +41,8 @@ advance
4041 => cursor
4142 -> Int
4243 -> Aff (idb :: IDB | e) Unit
43−advance =
44− Fn.runFn2 _advance
44+advance c =
45+ fromEffFnAff <<< Fn.runFn2 _advance c
4546
4647
4748-- | Advances the cursor to the next record in range matching or after key.
@@ -51,7 +52,7 @@ continue
5152 -> Maybe k
5253 -> Aff (idb :: IDB | e) Unit
5354continue c mk =
54− Fn.runFn2 _continue c (toNullable $ map (toKey >>> unsafeFromKey) mk)
55+ fromEffFnAff $ Fn.runFn2 _continue c (toNullable $ map (toKey >>> unsafeFromKey) mk)
5556
5657
5758-- | Advances the cursor to the next record in range matching or after key and primaryKey. Throws an "InvalidAccessError" DOMException if the source is not an index.
@@ -62,7 +63,7 @@ continuePrimaryKey
6263 -> k
6364 -> Aff (idb :: IDB | e) Unit
6465continuePrimaryKey c k1 k2 =
65− Fn.runFn3 _continuePrimaryKey c (unsafeFromKey $ toKey k1) (unsafeFromKey $ toKey k2)
66+ fromEffFnAff $ Fn.runFn3 _continuePrimaryKey c (unsafeFromKey $ toKey k1) (unsafeFromKey $ toKey k2)
6667
6768
6869-- | Delete the record pointed at by the cursor with a new value.
@@ -71,7 +72,7 @@ delete
7172 => cursor
7273 -> Aff (idb :: IDB | e) Unit
7374delete =
74− _delete
75+ fromEffFnAff <<< _delete
7576
7677
7778-- | Update the record pointed at by the cursor with a new value.
@@ -84,7 +85,7 @@ update
8485 -> val
8586 -> Aff (idb :: IDB | e) Key
8687update c =
87− toForeign >>> Fn.runFn2 _update c >>> map toKey
88+ map toKey <<< fromEffFnAff <<< Fn.runFn2 _update c <<< toForeign
8889
8990
9091--------------------
@@ -107,7 +108,7 @@ key
107108 => cursor
108109 -> Aff (idb :: IDB | e) Key
109110key =
110− _key >>> map toKey
111+ map toKey <<< fromEffFnAff <<< _key
111112
112113
113114-- | Returns the effective key of the cursor. Throws a "InvalidStateError" DOMException
@@ -117,7 +118,7 @@ primaryKey
117118 => cursor
118119 -> Aff (idb :: IDB | e) Key
119120primaryKey =
120− _primaryKey >>> map toKey
121+ map toKey <<< fromEffFnAff <<< _primaryKey
121122
122123
123124-- | Returns the IDBObjectStore or IDBIndex the cursor was opened from.
@@ -143,23 +144,23 @@ value =
143144
144145foreign import _advance
145146 :: forall cursor e
146− . Fn2 cursor Int (Aff (idb :: IDB | e) Unit)
147+ . Fn2 cursor Int (EffFnAff (idb :: IDB | e) Unit)
147148
148149
149150foreign import _continue
150151 :: forall cursor e
151− . Fn2 cursor (Nullable Foreign) (Aff (idb :: IDB | e) Unit)
152+ . Fn2 cursor (Nullable Foreign) (EffFnAff (idb :: IDB | e) Unit)
152153
153154
154155foreign import _continuePrimaryKey
155156 :: forall cursor e
156− . Fn3 cursor Foreign Foreign (Aff (idb :: IDB | e) Unit)
157+ . Fn3 cursor Foreign Foreign (EffFnAff (idb :: IDB | e) Unit)
157158
158159
159160foreign import _delete
160161 :: forall cursor e
161162 . cursor
162− -> (Aff (idb :: IDB | e) Unit)
163+ -> (EffFnAff (idb :: IDB | e) Unit)
163164
164165
165166foreign import _direction
@@ -170,13 +171,13 @@ foreign import _direction
170171foreign import _key
171172 :: forall cursor e
172173 . cursor
173− -> Aff (idb :: IDB | e) Key
174+ -> EffFnAff (idb :: IDB | e) Key
174175
175176
176177foreign import _primaryKey
177178 :: forall cursor e
178179 . cursor
179− -> Aff (idb :: IDB | e) Key
180+ -> EffFnAff (idb :: IDB | e) Key
180181
181182
182183foreign import _source
@@ -186,7 +187,7 @@ foreign import _source
186187
187188foreign import _update
188189 :: forall cursor e
189− . Fn2 cursor Foreign (Aff (idb :: IDB | e) Foreign)
190+ . Fn2 cursor Foreign (EffFnAff (idb :: IDB | e) Foreign)
190191
191192
192193foreign import _value
src/Database/IndexedDB/IDBDatabase.js+43−9
@@ -4,18 +4,22 @@ const toArray = function toArray(xs) {
44
55
66exports._close = function _close(db) {
7− return function aff(success, error) {
7+ return function aff(error, success) {
88 try {
99 db.close();
1010 success();
1111 } catch (e) {
1212 error(e);
1313 }
14+
15+ return function canceler(_, cancelerError) {
16+ cancelerError(new Error("Can't cancel IDB Effects"));
17+ };
1418 };
1519};
1620
1721exports._createObjectStore = function _createObjectStore(db, name, opts) {
18− return function aff(success, error) {
22+ return function aff(error, success) {
1923 var keyPath;
2024
2125 try {
@@ -41,17 +45,25 @@ exports._createObjectStore = function _createObjectStore(db, name, opts) {
4145 } catch (e) {
4246 error(e);
4347 }
48+
49+ return function canceler(_, cancelerError) {
50+ cancelerError(new Error("Can't cancel IDB Effects"));
51+ };
4452 };
4553};
4654
4755exports._deleteObjectStore = function _deleteObjectStore(db, name) {
48− return function aff(success, error) {
56+ return function aff(error, success) {
4957 try {
5058 db.deleteObjectStore(name);
5159 success();
5260 } catch (e) {
5361 error(e);
5462 }
63+
64+ return function canceler(_, cancelerError) {
65+ cancelerError(new Error("Can't cancel IDB Effects"));
66+ };
5567 };
5668};
5769
@@ -64,49 +76,71 @@ exports._objectStoreNames = function _objectStoreNames(db) {
6476};
6577
6678exports._onAbort = function _onAbort(db, f) {
67− return function aff(success) {
79+ return function aff(error, success) {
6880 db.onabort = function onabort() {
6981 f();
7082 };
7183 success();
84+
85+ return function canceler(_, cancelerError) {
86+ cancelerError(new Error("Can't cancel IDB Effects"));
87+ };
7288 };
7389};
7490
7591exports._onClose = function _onClose(db, f) {
76− return function aff(success) {
92+ return function aff(error, success) {
7793 db.onclose = function onclose() {
7894 f();
7995 };
8096 success();
97+
98+ return function canceler(_, cancelerError) {
99+ cancelerError(new Error("Can't cancel IDB Effects"));
100+ };
81101 };
82102};
83103
84104exports._onError = function _onError(db, f) {
85− return function aff(success) {
105+ return function aff(error, success) {
86106 db.onerror = function onerror(e) {
87107 f(e.target.error)();
88108 };
89109 success();
110+
111+ return function canceler(_, cancelerError) {
112+ cancelerError(new Error("Can't cancel IDB Effects"));
113+ };
90114 };
91115};
92116
93117exports._onVersionChange = function _onVersionChange(db, f) {
94− return function aff(success) {
118+ return function aff(error, success) {
95119 db.onversionchange = function onversionchange(e) {
96120 f({ oldVersion: e.oldVersion, newVersion: e.newVersion })();
97121 };
98122 success();
123+
124+ return function canceler(_, cancelerError) {
125+ cancelerError(new Error("Can't cancel IDB Effects"));
126+ };
99127 };
100128};
101129
102130exports._transaction = function _transaction(db, stores, mode) {
103− return function aff(success, error) {
131+ return function aff(error, success) {
132+ var transaction;
104133 try {
105− const transaction = db.transaction(stores, mode);
134+ transaction = db.transaction(stores, mode);
106135 success(transaction);
107136 } catch (e) {
108137 error(e);
109138 }
139+
140+ return function canceler(_, cancelerError, cancelerSuccess) {
141+ transaction.abort();
142+ cancelerSuccess();
143+ };
110144 };
111145};
112146
src/Database/IndexedDB/IDBDatabase.purs+18−17
@@ -24,9 +24,10 @@ module Database.IndexedDB.IDBDatabase
2424 , onVersionChange
2525 ) where
2626
27−import Prelude (Unit, show)
27+import Prelude (Unit, show, (<<<), ($))
2828
2929import Control.Monad.Aff (Aff)
30+import Control.Monad.Aff.Compat (fromEffFnAff, EffFnAff)
3031import Control.Monad.Eff (Eff)
3132import Control.Monad.Eff.Exception (Error)
3233import Data.Function.Uncurried as Fn
@@ -67,7 +68,7 @@ close
6768 => db
6869 -> Aff (idb :: IDB | e) Unit
6970close =
70− _close
71+ fromEffFnAff <<< _close
7172
7273
7374-- | Creates a new object store with the given name and options and returns a new IDBObjectStore.
@@ -80,7 +81,7 @@ createObjectStore
8081 -> ObjectStoreParameters
8182 -> Aff (idb :: IDB | e) ObjectStore
8283createObjectStore db name' opts =
83− Fn.runFn3 _createObjectStore db name' opts
84+ fromEffFnAff $ Fn.runFn3 _createObjectStore db name' opts
8485
8586
8687-- | Deletes the object store with the given name.
@@ -92,7 +93,7 @@ deleteObjectStore
9293 -> StoreName
9394 -> Aff (idb :: IDB | e) ObjectStore
9495deleteObjectStore db name' =
95− Fn.runFn2 _deleteObjectStore db name'
96+ fromEffFnAff $ Fn.runFn2 _deleteObjectStore db name'
9697
9798
9899-- | Returns a new transaction with the given mode (ReadOnly|ReadWrite)
@@ -104,7 +105,7 @@ transaction
104105 -> TransactionMode
105106 -> Aff (idb :: IDB | e) Transaction
106107transaction db stores mode' =
107− Fn.runFn3 _transaction db stores (show mode')
108+ fromEffFnAff $ Fn.runFn3 _transaction db stores (show mode')
108109
109110
110111--------------------
@@ -145,7 +146,7 @@ onAbort
145146 -> Eff ( | e') Unit
146147 -> Aff (idb :: IDB | e) Unit
147148onAbort db f =
148− Fn.runFn2 _onAbort db f
149+ fromEffFnAff $ Fn.runFn2 _onAbort db f
149150
150151
151152-- | Event handler for the `close` event.
@@ -155,7 +156,7 @@ onClose
155156 -> Eff ( | e') Unit
156157 -> Aff (idb :: IDB | e) Unit
157158onClose db f =
158− Fn.runFn2 _onClose db f
159+ fromEffFnAff $ Fn.runFn2 _onClose db f
159160
160161
161162-- | Event handler for the `error` event.
@@ -165,7 +166,7 @@ onError
165166 -> (Error -> Eff ( | e') Unit)
166167 -> Aff (idb :: IDB | e) Unit
167168onError db f =
168− Fn.runFn2 _onError db f
169+ fromEffFnAff $ Fn.runFn2 _onError db f
169170
170171
171172-- | Event handler for the `versionchange` event.
@@ -176,7 +177,7 @@ onVersionChange
176177 -> Eff ( | e') Unit)
177178 -> Aff (idb :: IDB | e) Unit
178179onVersionChange db f =
179− Fn.runFn2 _onVersionChange db f
180+ fromEffFnAff $ Fn.runFn2 _onVersionChange db f
180181
181182
182183--------------------
@@ -186,17 +187,17 @@ onVersionChange db f =
186187foreign import _close
187188 :: forall db e
188189 . db
189− -> Aff (idb :: IDB | e) Unit
190+ -> EffFnAff (idb :: IDB | e) Unit
190191
191192
192193foreign import _createObjectStore
193194 :: forall db e
194− . Fn3 db String { keyPath :: Array String, autoIncrement :: Boolean } (Aff (idb :: IDB | e) ObjectStore)
195+ . Fn3 db String { keyPath :: Array String, autoIncrement :: Boolean } (EffFnAff (idb :: IDB | e) ObjectStore)
195196
196197
197198foreign import _deleteObjectStore
198199 :: forall db e
199− . Fn2 db String (Aff (idb :: IDB | e) ObjectStore)
200+ . Fn2 db String (EffFnAff (idb :: IDB | e) ObjectStore)
200201
201202
202203foreign import _name
@@ -211,27 +212,27 @@ foreign import _objectStoreNames
211212
212213foreign import _onAbort
213214 :: forall db e e'
214− . Fn2 db (Eff ( | e') Unit) (Aff (idb :: IDB | e) Unit)
215+ . Fn2 db (Eff ( | e') Unit) (EffFnAff (idb :: IDB | e) Unit)
215216
216217
217218foreign import _onClose
218219 :: forall db e e'
219− . Fn2 db (Eff ( | e') Unit) (Aff (idb :: IDB | e) Unit)
220+ . Fn2 db (Eff ( | e') Unit) (EffFnAff (idb :: IDB | e) Unit)
220221
221222
222223foreign import _onError
223224 :: forall db e e'
224− . Fn2 db (Error -> Eff ( | e') Unit) (Aff (idb :: IDB | e) Unit)
225+ . Fn2 db (Error -> Eff ( | e') Unit) (EffFnAff (idb :: IDB | e) Unit)
225226
226227
227228foreign import _onVersionChange
228229 :: forall db e e'
229− . Fn2 db ({ oldVersion :: Int, newVersion :: Int } -> Eff ( | e') Unit) (Aff (idb :: IDB | e) Unit)
230+ . Fn2 db ({ oldVersion :: Int, newVersion :: Int } -> Eff ( | e') Unit) (EffFnAff (idb :: IDB | e) Unit)
230231
231232
232233foreign import _transaction
233234 :: forall db e
234− . Fn3 db (Array String) String (Aff (idb :: IDB | e) Transaction)
235+ . Fn3 db (Array String) String (EffFnAff (idb :: IDB | e) Transaction)
235236
236237
237238foreign import _version
src/Database/IndexedDB/IDBFactory.js+11−2
@@ -19,7 +19,7 @@ const noOp3 = function noOp3() {
1919};
2020
2121exports._deleteDatabase = function _deleteDatabase(name) {
22− return function aff(success, error) {
22+ return function aff(error, success) {
2323 try {
2424 const request = indexedDB.deleteDatabase(name);
2525
@@ -31,13 +31,17 @@ exports._deleteDatabase = function _deleteDatabase(name) {
3131 } catch (e) {
3232 error(e);
3333 }
34+
35+ return function canceler(_, cancelerError) {
36+ cancelerError(new Error("Can't cancel IDB Effects"));
37+ };
3438 };
3539};
3640
3741exports._open = function _open(fromMaybe, name, mver, req) {
3842 const ver = fromMaybe(undefined)(mver);
3943
40− return function aff(success, error) {
44+ return function aff(error, success) {
4145 try {
4246 const request = indexedDB.open(name, ver);
4347 request.onsuccess = function onSuccess(e) {
@@ -50,6 +54,7 @@ exports._open = function _open(fromMaybe, name, mver, req) {
5054
5155 request.onupgradeneeded = function onUpgradeNeeded(e) {
5256 const meta = { oldVersion: e.oldVersion };
57+ // eslint-disable-next-line max-len
5358 fromMaybe(noOp3)(req.onUpgradeNeeded)(e.target.result)(e.target.transaction)(meta)();
5459 };
5560
@@ -57,5 +62,9 @@ exports._open = function _open(fromMaybe, name, mver, req) {
5762 } catch (e) {
5863 error(e);
5964 }
65+
66+ return function canceler(_, cancelerError) {
67+ cancelerError(new Error("Can't cancel IDB Effects"));
68+ };
6069 };
6170};
src/Database/IndexedDB/IDBFactory.purs+11−10
@@ -12,13 +12,14 @@ module Database.IndexedDB.IDBFactory
1212 , open
1313 ) where
1414
15−import Prelude (Unit)
15+import Prelude (Unit, ($), (<<<))
1616
17−import Control.Monad.Aff (Aff)
18−import Control.Monad.Eff (Eff)
19−import Data.Function.Uncurried as Fn
20−import Data.Function.Uncurried (Fn4)
21−import Data.Maybe (Maybe, fromMaybe)
17+import Control.Monad.Aff (Aff)
18+import Control.Monad.Aff.Compat (fromEffFnAff, EffFnAff)
19+import Control.Monad.Eff (Eff)
20+import Data.Function.Uncurried as Fn
21+import Data.Function.Uncurried (Fn4)
22+import Data.Maybe (Maybe, fromMaybe)
2223
2324import Database.IndexedDB.Core
2425
@@ -54,7 +55,7 @@ deleteDatabase
5455 . DatabaseName
5556 -> Aff (idb :: IDB | e) Int
5657deleteDatabase =
57− _deleteDatabase
58+ fromEffFnAff <<< _deleteDatabase
5859
5960
6061-- | Attempts to open a connection to the named database with the specified version.
@@ -72,7 +73,7 @@ open
7273 -> Callbacks e'
7374 -> Aff (idb :: IDB | e) Database
7475open name mver req =
75− Fn.runFn4 _open fromMaybe name mver req
76+ fromEffFnAff $ Fn.runFn4 _open fromMaybe name mver req
7677
7778
7879--------------------
@@ -81,9 +82,9 @@ open name mver req =
8182foreign import _deleteDatabase
8283 :: forall e
8384 . String
84− -> Aff (idb :: IDB | e) Int
85+ -> EffFnAff (idb :: IDB | e) Int
8586
8687
8788foreign import _open
8889 :: forall a e e'
89− . Fn4 (a -> Maybe a -> a) String (Maybe Int) (Callbacks e') (Aff (idb :: IDB | e) Database)
90+ . Fn4 (a -> Maybe a -> a) String (Maybe Int) (Callbacks e') (EffFnAff (idb :: IDB | e) Database)
src/Database/IndexedDB/IDBIndex.js+31−7
@@ -42,7 +42,7 @@ exports._unique = function _unique(index) {
4242};
4343
4444exports._count = function _count(index, query) {
45− return function aff(success, error) {
45+ return function aff(error, success) {
4646 try {
4747 const request = index.count(query);
4848 request.onsuccess = successHandler(success);
@@ -50,11 +50,15 @@ exports._count = function _count(index, query) {
5050 } catch (e) {
5151 error(e);
5252 }
53+
54+ return function canceler(_, cancelerError) {
55+ cancelerError(new Error("Can't cancel IDB Effects"));
56+ };
5357 };
5458};
5559
5660exports._get = function _get(index, range) {
57− return function aff(success, error) {
61+ return function aff(error, success) {
5862 try {
5963 const request = index.get(range);
6064 request.onsuccess = successHandler(success);
@@ -62,6 +66,10 @@ exports._get = function _get(index, range) {
6266 } catch (e) {
6367 error(e);
6468 }
69+
70+ return function canceler(_, cancelerError) {
71+ cancelerError(new Error("Can't cancel IDB Effects"));
72+ };
6573 };
6674};
6775
@@ -72,7 +80,7 @@ exports._get = function _get(index, range) {
7280 * However, it may be doable to convert the result to some key / value structure with values of
7381 * different types.
7482exports._getAll = function _getAll(index, query, count) {
75− return function aff(success, error) {
83+ return function aff(error, success) {
7684 const request = index.getAll(query, count);
7785 request.onsuccess = successHandler(success);
7886 request.onerror = errorHandler(error);
@@ -81,7 +89,7 @@ exports._getAll = function _getAll(index, query, count) {
8189*/
8290
8391exports._getAllKeys = function _getAllKeys(index, range, count) {
84− return function aff(success, error) {
92+ return function aff(error, success) {
8593 try {
8694 const request = index.getAllKeys(range, count || undefined);
8795 request.onsuccess = successHandler(success);
@@ -89,11 +97,15 @@ exports._getAllKeys = function _getAllKeys(index, range, count) {
8997 } catch (e) {
9098 error(e);
9199 }
100+
101+ return function canceler(_, cancelerError) {
102+ cancelerError(new Error("Can't cancel IDB Effects"));
103+ };
92104 };
93105};
94106
95107exports._getKey = function _getKey(index, range) {
96− return function aff(success, error) {
108+ return function aff(error, success) {
97109 try {
98110 const request = index.getKey(range);
99111 request.onsuccess = successHandler(success);
@@ -101,11 +113,15 @@ exports._getKey = function _getKey(index, range) {
101113 } catch (e) {
102114 error(e);
103115 }
116+
117+ return function canceler(_, cancelerError) {
118+ cancelerError(new Error("Can't cancel IDB Effects"));
119+ };
104120 };
105121};
106122
107123exports._openCursor = function _openCursor(index, query, dir, cb) {
108− return function aff(success, error) {
124+ return function aff(error, success) {
109125 try {
110126 const request = index.openCursor(query, dir);
111127 request.onsuccess = function onSuccess(e) {
@@ -122,11 +138,15 @@ exports._openCursor = function _openCursor(index, query, dir, cb) {
122138 } catch (e) {
123139 error(e);
124140 }
141+
142+ return function canceler(_, cancelerError) {
143+ cancelerError(new Error("Can't cancel IDB Effects"));
144+ };
125145 };
126146};
127147
128148exports._openKeyCursor = function _openKeyCursor(index, query, dir, cb) {
129− return function aff(success, error) {
149+ return function aff(error, success) {
130150 try {
131151 const request = index.openKeyCursor(query, dir);
132152 request.onsuccess = function onSuccess(e) {
@@ -143,5 +163,9 @@ exports._openKeyCursor = function _openKeyCursor(index, query, dir, cb) {
143163 } catch (e) {
144164 error(e);
145165 }
166+
167+ return function canceler(_, cancelerError) {
168+ cancelerError(new Error("Can't cancel IDB Effects"));
169+ };
146170 };
147171};
src/Database/IndexedDB/IDBIndex.purs+14−13
@@ -20,9 +20,10 @@ module Database.IndexedDB.IDBIndex
2020 , unique
2121 ) where
2222
23−import Prelude (Unit, map, show, (<$>), (>>>))
23+import Prelude (Unit, map, show, (<$>), (>>>), ($))
2424
2525import Control.Monad.Aff (Aff)
26+import Control.Monad.Aff.Compat (EffFnAff, fromEffFnAff)
2627import Control.Monad.Eff (Eff)
2728import Control.Monad.Eff.Exception (Error)
2829import Data.Foreign (Foreign, unsafeFromForeign)
@@ -58,7 +59,7 @@ count
5859 -> Maybe KeyRange
5960 -> Aff (idb :: IDB | e) Int
6061count index range =
61− Fn.runFn2 _count index (toNullable range)
62+ fromEffFnAff $ Fn.runFn2 _count index (toNullable range)
6263
6364
6465-- | Retrieves the value of the first record matching the given key range in query.
@@ -71,7 +72,7 @@ get
7172 -> KeyRange
7273 -> Aff (idb :: IDB | e) (Maybe a)
7374get index range =
74− (toMaybe >>> map unsafeFromForeign) <$> Fn.runFn2 _get index range
75+ map (toMaybe >>> map unsafeFromForeign) $ fromEffFnAff $ Fn.runFn2 _get index range
7576
7677
7778-- | Retrieves the keys of records matching the given key range in query
@@ -83,7 +84,7 @@ getAllKeys
8384 -> Maybe Int
8485 -> Aff (idb :: IDB | e) (Array Key)
8586getAllKeys index range n =
86− map toKey <$> Fn.runFn3 _getAllKeys index (toNullable range) (toNullable n)
87+ map (map toKey) $ fromEffFnAff $ Fn.runFn3 _getAllKeys index (toNullable range) (toNullable n)
8788
8889
8990-- | Retrieves the key of the first record matching the given key or key range in query.
@@ -93,7 +94,7 @@ getKey
9394 -> KeyRange
9495 -> Aff (idb :: IDB | e) (Maybe Key)
9596getKey index range =
96− (toMaybe >>> map toKey) <$> Fn.runFn2 _getKey index range
97+ map (toMaybe >>> map toKey) $ fromEffFnAff $ Fn.runFn2 _getKey index range
9798
9899
99100-- | Opens a ValueCursor over the records matching query, ordered by direction.
@@ -106,7 +107,7 @@ openCursor
106107 -> Callbacks ValueCursor e'
107108 -> Aff (idb :: IDB | e) Unit
108109openCursor index range dir cb =
109− Fn.runFn4 _openCursor index (toNullable range) (show dir) cb
110+ fromEffFnAff $ Fn.runFn4 _openCursor index (toNullable range) (show dir) cb
110111
111112
112113-- | Opens a KeyCursor over the records matching query, ordered by direction.
@@ -119,7 +120,7 @@ openKeyCursor
119120 -> Callbacks KeyCursor e'
120121 -> Aff (idb :: IDB | e) Unit
121122openKeyCursor index range dir cb =
122− Fn.runFn4 _openKeyCursor index (toNullable range) (show dir) cb
123+ fromEffFnAff $ Fn.runFn4 _openKeyCursor index (toNullable range) (show dir) cb
123124
124125
125126--------------------
@@ -195,29 +196,29 @@ foreign import _unique
195196
196197foreign import _count
197198 :: forall index e
198− . Fn2 index (Nullable KeyRange) (Aff (idb :: IDB | e) Int)
199+ . Fn2 index (Nullable KeyRange) (EffFnAff (idb :: IDB | e) Int)
199200
200201
201202foreign import _get
202203 :: forall index e
203− . Fn2 index KeyRange (Aff (idb :: IDB | e) (Nullable Foreign))
204+ . Fn2 index KeyRange (EffFnAff (idb :: IDB | e) (Nullable Foreign))
204205
205206
206207foreign import _getAllKeys
207208 :: forall index e
208− . Fn3 index (Nullable KeyRange) (Nullable Int) (Aff (idb :: IDB | e) (Array Foreign))
209+ . Fn3 index (Nullable KeyRange) (Nullable Int) (EffFnAff (idb :: IDB | e) (Array Foreign))
209210
210211
211212foreign import _getKey
212213 :: forall index e
213− . Fn2 index KeyRange (Aff (idb :: IDB | e) (Nullable Foreign))
214+ . Fn2 index KeyRange (EffFnAff (idb :: IDB | e) (Nullable Foreign))
214215
215216
216217foreign import _openCursor
217218 :: forall index e e'
218− . Fn4 index (Nullable KeyRange) String (Callbacks ValueCursor e') (Aff (idb :: IDB | e) Unit)
219+ . Fn4 index (Nullable KeyRange) String (Callbacks ValueCursor e') (EffFnAff (idb :: IDB | e) Unit)
219220
220221
221222foreign import _openKeyCursor
222223 :: forall index e e'
223− . Fn4 index (Nullable KeyRange) String (Callbacks KeyCursor e') (Aff (idb :: IDB | e) Unit)
224+ . Fn4 index (Nullable KeyRange) String (Callbacks KeyCursor e') (EffFnAff (idb :: IDB | e) Unit)
src/Database/IndexedDB/IDBObjectStore.js+35−7
@@ -16,7 +16,7 @@ const toArray = function toArray(xs) {
1616
1717
1818exports._add = function _add(store, value, key) {
19− return function aff(success, error) {
19+ return function aff(error, success) {
2020 try {
2121 const request = store.add(value, key || undefined);
2222 request.onsuccess = successHandler(success);
@@ -24,6 +24,10 @@ exports._add = function _add(store, value, key) {
2424 } catch (e) {
2525 error(e);
2626 }
27+
28+ return function canceler(_, cancelerError) {
29+ cancelerError(new Error("Can't cancel IDB Effects"));
30+ };
2731 };
2832};
2933
@@ -32,7 +36,7 @@ exports._autoIncrement = function _autoIncrement(store) {
3236};
3337
3438exports._clear = function _clear(store) {
35− return function aff(success, error) {
39+ return function aff(error, success) {
3640 try {
3741 const request = store.clear();
3842 request.onsuccess = successHandler(success);
@@ -40,11 +44,15 @@ exports._clear = function _clear(store) {
4044 } catch (e) {
4145 error(e);
4246 }
47+
48+ return function canceler(_, cancelerError) {
49+ cancelerError(new Error("Can't cancel IDB Effects"));
50+ };
4351 };
4452};
4553
4654exports._createIndex = function _createIndex(store, name, path, params) {
47− return function aff(success, error) {
55+ return function aff(error, success) {
4856 var keyPath;
4957
5058 try {
@@ -66,22 +74,30 @@ exports._createIndex = function _createIndex(store, name, path, params) {
6674 } catch (e) {
6775 error(e);
6876 }
77+
78+ return function canceler(_, cancelerError) {
79+ cancelerError(new Error("Can't cancel IDB Effects"));
80+ };
6981 };
7082};
7183
7284exports._deleteIndex = function _deleteIndex(store, name) {
73− return function aff(success, error) {
85+ return function aff(error, success) {
7486 try {
7587 store.deleteIndex(name);
7688 success();
7789 } catch (e) {
7890 error(e);
7991 }
92+
93+ return function canceler(_, cancelerError) {
94+ cancelerError(new Error("Can't cancel IDB Effects"));
95+ };
8096 };
8197};
8298
8399exports._delete = function _delete(store, query) {
84− return function aff(success, error) {
100+ return function aff(error, success) {
85101 try {
86102 const request = store.delete(query);
87103 request.onsuccess = successHandler(success);
@@ -89,17 +105,25 @@ exports._delete = function _delete(store, query) {
89105 } catch (e) {
90106 error(e);
91107 }
108+
109+ return function canceler(_, cancelerError) {
110+ cancelerError(new Error("Can't cancel IDB Effects"));
111+ };
92112 };
93113};
94114
95115exports._index = function _index(store, name) {
96− return function aff(success, error) {
116+ return function aff(error, success) {
97117 try {
98118 const index = store.index(name);
99119 success(index);
100120 } catch (e) {
101121 error(e);
102122 }
123+
124+ return function canceler(_, cancelerError) {
125+ cancelerError(new Error("Can't cancel IDB Effects"));
126+ };
103127 };
104128};
105129
@@ -126,7 +150,7 @@ exports._name = function _name(store) {
126150};
127151
128152exports._put = function _put(store, value, key) {
129− return function aff(success, error) {
153+ return function aff(error, success) {
130154 try {
131155 const request = store.put(value, key || undefined);
132156 request.onsuccess = successHandler(success);
@@ -134,6 +158,10 @@ exports._put = function _put(store, value, key) {
134158 } catch (e) {
135159 error(e);
136160 }
161+
162+ return function canceler(_, cancelerError) {
163+ cancelerError(new Error("Can't cancel IDB Effects"));
164+ };
137165 };
138166};
139167
src/Database/IndexedDB/IDBObjectStore.purs+16−15
@@ -25,9 +25,10 @@ module Database.IndexedDB.IDBObjectStore
2525 , module Database.IndexedDB.IDBIndex
2626 ) where
2727
28−import Prelude (Unit, ($), (<$>), (>>>))
28+import Prelude (Unit, map, ($), (<$>), (>>>), (<<<))
2929
3030import Control.Monad.Aff (Aff)
31+import Control.Monad.Aff.Compat (EffFnAff, fromEffFnAff)
3132import Data.Foreign (Foreign)
3233import Data.Function.Uncurried as Fn
3334import Data.Function.Uncurried (Fn2, Fn3, Fn4)
@@ -90,7 +91,7 @@ add
9091 -> Maybe key
9192 -> Aff (idb :: IDB | e) Key
9293add store value key =
93− toKey <$> Fn.runFn3 _add store value (toNullable $ (toKey >>> unsafeFromKey) <$> key)
94+ map toKey $ fromEffFnAff $ Fn.runFn3 _add store value (toNullable $ (toKey >>> unsafeFromKey) <$> key)
9495
9596
9697-- | Deletes all records in store.
@@ -99,7 +100,7 @@ clear
99100 => store
100101 -> Aff (idb :: IDB | e) Unit
101102clear =
102− _clear
103+ fromEffFnAff <<< _clear
103104
104105
105106-- | Creates a new index in store with the given name, keyPath and options and
@@ -116,7 +117,7 @@ createIndex
116117 -> IndexParameters
117118 -> Aff (idb :: IDB | e) Index
118119createIndex store name' path params =
119− Fn.runFn4 _createIndex store name' path params
120+ fromEffFnAff $ Fn.runFn4 _createIndex store name' path params
120121
121122
122123-- | Deletes records in store with the given key or in the given key range in query.
@@ -126,7 +127,7 @@ delete
126127 -> KeyRange
127128 -> Aff (idb :: IDB | e) Unit
128129delete store range =
129− Fn.runFn2 _delete store range
130+ fromEffFnAff $ Fn.runFn2 _delete store range
130131
131132
132133-- | Deletes the index in store with the given name.
@@ -138,7 +139,7 @@ deleteIndex
138139 -> IndexName
139140 -> Aff (idb :: IDB | e) Unit
140141deleteIndex store name' =
141− Fn.runFn2 _deleteIndex store name'
142+ fromEffFnAff $ Fn.runFn2 _deleteIndex store name'
142143
143144
144145-- | Returns an IDBIndex for the index named name in store.
@@ -148,7 +149,7 @@ index
148149 -> IndexName
149150 -> Aff (idb :: IDB | e) Index
150151index store name' =
151− Fn.runFn2 _index store name'
152+ fromEffFnAff $ Fn.runFn2 _index store name'
152153
153154
154155-- | Adds or updates a record in store with the given value and key.
@@ -164,7 +165,7 @@ put
164165 -> Maybe key
165166 -> Aff (idb :: IDB | e) Key
166167put store value key =
167− toKey <$> Fn.runFn3 _put store value (toNullable $ (toKey >>> unsafeFromKey) <$> key)
168+ map toKey $ fromEffFnAff $ Fn.runFn3 _put store value (toNullable $ (toKey >>> unsafeFromKey) <$> key)
168169
169170
170171--------------------
@@ -215,7 +216,7 @@ transaction =
215216--
216217foreign import _add
217218 :: forall e val store
218− . Fn3 store val (Nullable Foreign) (Aff (idb :: IDB | e) Foreign)
219+ . Fn3 store val (Nullable Foreign) (EffFnAff (idb :: IDB | e) Foreign)
219220
220221
221222foreign import _autoIncrement
@@ -226,27 +227,27 @@ foreign import _autoIncrement
226227foreign import _clear
227228 :: forall e store
228229 . store
229− -> Aff (idb :: IDB | e) Unit
230+ -> EffFnAff (idb :: IDB | e) Unit
230231
231232
232233foreign import _createIndex
233234 :: forall e store
234− . Fn4 store String (Array String) { unique :: Boolean, multiEntry :: Boolean } (Aff (idb :: IDB | e) Index)
235+ . Fn4 store String (Array String) { unique :: Boolean, multiEntry :: Boolean } (EffFnAff (idb :: IDB | e) Index)
235236
236237
237238foreign import _delete
238239 :: forall e store
239− . Fn2 store KeyRange (Aff (idb :: IDB | e) Unit)
240+ . Fn2 store KeyRange (EffFnAff (idb :: IDB | e) Unit)
240241
241242
242243foreign import _deleteIndex
243244 :: forall e store
244− . Fn2 store String (Aff (idb :: IDB | e) Unit)
245+ . Fn2 store String (EffFnAff (idb :: IDB | e) Unit)
245246
246247
247248foreign import _index
248249 :: forall e store
249− . Fn2 store String (Aff (idb :: IDB | e) Index)
250+ . Fn2 store String (EffFnAff (idb :: IDB | e) Index)
250251
251252
252253foreign import _indexNames
@@ -266,7 +267,7 @@ foreign import _name
266267
267268foreign import _put
268269 :: forall e val store
269− . Fn3 store val (Nullable Foreign) (Aff (idb :: IDB | e) Foreign)
270+ . Fn3 store val (Nullable Foreign) (EffFnAff (idb :: IDB | e) Foreign)
270271
271272
272273foreign import _transaction
src/Database/IndexedDB/IDBTransaction.js+25−5
@@ -1,11 +1,15 @@
11exports._abort = function _abort(tx) {
2− return function aff(success, error) {
2+ return function aff(error, success) {
33 try {
44 tx.abort();
55 success();
66 } catch (e) {
77 error(e);
88 }
9+
10+ return function canceler(_, cancelerError) {
11+ cancelerError(new Error("Can't cancel IDB Effects"));
12+ };
913 };
1014};
1115
@@ -30,13 +34,17 @@ exports._mode = function _mode(ReadOnly, ReadWrite, VersionChange, tx) {
3034};
3135
3236exports._objectStore = function _objectStore(tx, name) {
33− return function aff(success, error) {
37+ return function aff(error, success) {
3438 try {
3539 const store = tx.objectStore(name);
3640 success(store);
3741 } catch (e) {
3842 error(e);
3943 }
44+
45+ return function canceler(_, cancelerError) {
46+ cancelerError(new Error("Can't cancel IDB Effects"));
47+ };
4048 };
4149};
4250
@@ -45,28 +53,40 @@ exports._objectStoreNames = function _objectStoreNames(tx) {
4553};
4654
4755exports._onAbort = function _onAbort(tx, f) {
48− return function aff(success) {
56+ return function aff(error, success) {
4957 tx.onabort = function onabort() {
5058 f();
5159 };
5260 success();
61+
62+ return function canceler(_, cancelerError) {
63+ cancelerError(new Error("Can't cancel IDB Effects"));
64+ };
5365 };
5466};
5567
5668exports._onComplete = function _onComplete(tx, f) {
57− return function aff(success) {
69+ return function aff(error, success) {
5870 tx.oncomplete = function oncomplete() {
5971 f();
6072 };
6173 success();
74+
75+ return function canceler(_, cancelerError) {
76+ cancelerError(new Error("Can't cancel IDB Effects"));
77+ };
6278 };
6379};
6480
6581exports._onError = function _onError(tx, f) {
66− return function aff(success) {
82+ return function aff(error, success) {
6783 tx.onerror = function onerror(e) {
6884 f(e.target.error)();
6985 };
7086 success();
87+
88+ return function canceler(_, cancelerError) {
89+ cancelerError(new Error("Can't cancel IDB Effects"));
90+ };
7191 };
7292};
src/Database/IndexedDB/IDBTransaction.purs+12−12
@@ -14,9 +14,10 @@ module Database.IndexedDB.IDBTransaction
1414 , onError
1515 ) where
1616
17−import Prelude (Unit, (>>>))
17+import Prelude (Unit, ($), (<<<), (>>>))
1818
1919import Control.Monad.Aff (Aff)
20+import Control.Monad.Aff.Compat (EffFnAff, fromEffFnAff)
2021import Control.Monad.Eff (Eff)
2122import Control.Monad.Eff.Exception (Error)
2223import Data.Function.Uncurried as Fn
@@ -38,8 +39,7 @@ abort
3839 => tx
3940 -> Aff (idb :: IDB | e) Unit
4041abort =
41− _abort
42−
42+ fromEffFnAff <<< _abort
4343
4444-- | Returns an IDBObjectStore in the transaction's scope.
4545objectStore
@@ -48,7 +48,7 @@ objectStore
4848 -> String
4949 -> Aff (idb :: IDB | e) ObjectStore
5050objectStore tx name =
51− Fn.runFn2 _objectStore tx name
51+ fromEffFnAff $ Fn.runFn2 _objectStore tx name
5252
5353
5454--------------------
@@ -100,7 +100,7 @@ onAbort
100100 -> Eff ( | e') Unit
101101 -> Aff (idb :: IDB | e) Unit
102102onAbort db' f =
103− Fn.runFn2 _onAbort db' f
103+ fromEffFnAff $ Fn.runFn2 _onAbort db' f
104104
105105
106106-- | Event handler for the `complete` event.
@@ -110,7 +110,7 @@ onComplete
110110 -> Eff ( | e') Unit
111111 -> Aff (idb :: IDB | e) Unit
112112onComplete db' f =
113− Fn.runFn2 _onComplete db' f
113+ fromEffFnAff $ Fn.runFn2 _onComplete db' f
114114
115115
116116-- | Event handler for the `error` event.
@@ -120,7 +120,7 @@ onError
120120 -> (Error -> Eff ( | e') Unit)
121121 -> Aff (idb :: IDB | e) Unit
122122onError db' f =
123− Fn.runFn2 _onError db' f
123+ fromEffFnAff $ Fn.runFn2 _onError db' f
124124
125125
126126--------------------
@@ -130,7 +130,7 @@ onError db' f =
130130foreign import _abort
131131 :: forall tx e
132132 . tx
133− -> Aff (idb :: IDB | e) Unit
133+ -> EffFnAff (idb :: IDB | e) Unit
134134
135135
136136foreign import _db
@@ -154,19 +154,19 @@ foreign import _objectStoreNames
154154
155155foreign import _objectStore
156156 :: forall tx e
157− . Fn2 tx String (Aff (idb :: IDB | e) ObjectStore)
157+ . Fn2 tx String (EffFnAff (idb :: IDB | e) ObjectStore)
158158
159159
160160foreign import _onAbort
161161 :: forall tx e e'
162− . Fn2 tx (Eff ( | e') Unit) (Aff (idb :: IDB | e) Unit)
162+ . Fn2 tx (Eff ( | e') Unit) (EffFnAff (idb :: IDB | e) Unit)
163163
164164
165165foreign import _onComplete
166166 :: forall tx e e'
167− . Fn2 tx (Eff ( | e') Unit) (Aff (idb :: IDB | e) Unit)
167+ . Fn2 tx (Eff ( | e') Unit) (EffFnAff (idb :: IDB | e) Unit)
168168
169169
170170foreign import _onError
171171 :: forall tx e e'
172− . Fn2 tx (Error -> Eff ( | e') Unit) (Aff (idb :: IDB | e) Unit)
172+ . Fn2 tx (Error -> Eff ( | e') Unit) (EffFnAff (idb :: IDB | e) Unit)
test/Main.purs+78−71
@@ -2,8 +2,8 @@ module Test.Main where
22
33import Prelude
44
5−import Control.Monad.Aff (Aff, launchAff, forkAff, delay, attempt)
6−import Control.Monad.Aff.AVar (AVAR, makeVar, makeVar', modifyVar, peekVar, putVar, takeVar)
5+import Control.Monad.Aff (Aff, launchAff, launchAff_, forkAff, delay, attempt)
6+import Control.Monad.Aff.AVar (AVAR, AVar, makeVar, makeEmptyVar, readVar, putVar, takeVar)
77import Control.Monad.Aff.Console (log)
88import Control.Monad.Eff (Eff)
99import Control.Monad.Eff.Class (liftEff)
@@ -37,9 +37,16 @@ import Database.IndexedDB.IDBTransaction as IDBTransaction
3737
3838infixr 7 Tuple as :+:
3939
40−launchAff' :: forall a e. Aff e a -> Eff (exception :: EXCEPTION | e) Unit
41−launchAff' aff =
42− pure unit <* (launchAff aff)
40+launchAff' :: forall a e. Aff e a -> Eff e Unit
41+launchAff' =
42+ launchAff_
43+
44+
45+modifyVar :: forall eff a. (a -> a) -> AVar a -> Aff (avar :: AVAR | eff) Unit
46+modifyVar fn v = do
47+ val <- takeVar v
48+ putVar (fn val) v
49+
4350
4451-- main :: forall eff. Eff (now :: NOW, mocha :: MOCHA, idb :: IDB, exception :: EXCEPTION, avar :: AVAR | eff) Unit
4552main = runMocha do
@@ -75,17 +82,17 @@ main = runMocha do
7582 it "open specific version -> close -> open latest" do
7683 let name = "db-latest"
7784 version = 14
78− db <- IDBFactory.open name (Just version)
85+ db01 <- IDBFactory.open name (Just version)
7986 { onUpgradeNeeded : Nothing
8087 , onBlocked : Nothing
8188 }
82− IDBDatabase.name db `shouldEqual` name
83− IDBDatabase.close db
84− db <- IDBFactory.open name Nothing
89+ IDBDatabase.name db01 `shouldEqual` name
90+ IDBDatabase.close db01
91+ db02 <- IDBFactory.open name Nothing
8592 { onUpgradeNeeded : Nothing
8693 , onBlocked : Nothing
8794 }
88− tearDown name version db
95+ tearDown name version db02
8996
9097 it "open + onUpgradeNeed" do
9198 let name = "db-upgrade-needed"
@@ -94,14 +101,14 @@ main = runMocha do
94101 _ <- launchAff $ modifyVar (const $ IDBDatabase.name db) varName
95102 _ <- launchAff $ modifyVar (const $ oldVersion) varVersion
96103 pure unit
97− varName <- makeVar' "-"
98− varVersion <- makeVar' (-1)
104+ varName <- makeVar "-"
105+ varVersion <- makeVar (-1)
99106 db <- IDBFactory.open name Nothing
100107 { onUpgradeNeeded : Just (callback (Tuple varName varVersion))
101108 , onBlocked : Nothing
102109 }
103− name' <- peekVar varName
104− version' <- peekVar varVersion
110+ name' <- readVar varName
111+ version' <- readVar varVersion
105112 name' `shouldEqual` name
106113 version' `shouldEqual` 0
107114 tearDown name version db
@@ -113,7 +120,7 @@ main = runMocha do
113120 _ <- launchAff $ modifyVar (const $ "db-blocked") var
114121 pure unit
115122
116− var <- makeVar' "-"
123+ var <- makeVar "-"
117124 db01 <- IDBFactory.open name Nothing
118125 { onUpgradeNeeded : Nothing
119126 , onBlocked : Nothing
@@ -126,7 +133,7 @@ main = runMocha do
126133 { onUpgradeNeeded : Nothing
127134 , onBlocked : Just (callback var)
128135 }
129− name' <- peekVar var
136+ name' <- readVar var
130137 name' `shouldEqual` name
131138 tearDown name version db02
132139
@@ -293,10 +300,10 @@ main = runMocha do
293300 setup storeParams = do
294301 let onUpgradeNeeded var db _ _ = launchAff' do
295302 store <- IDBDatabase.createObjectStore db "store" storeParams
296− _ <- putVar var { db, store }
303+ _ <- putVar { db, store } var
297304 pure unit
298305
299− var <- makeVar
306+ var <- makeEmptyVar
300307 db <- IDBFactory.open "db" Nothing
301308 { onUpgradeNeeded : Just (onUpgradeNeeded var)
302309 , onBlocked : Nothing
@@ -331,17 +338,17 @@ main = runMocha do
331338 it "deleteObjectStore" do
332339 let onUpgradeNeeded var db _ _ = launchAff' do
333340 _ <- IDBDatabase.deleteObjectStore db "store"
334− putVar var true
341+ putVar true var
335342
336− var <- makeVar
343+ var <- makeEmptyVar
337344 { db, store } <- setup IDBDatabase.defaultParameters
338345 IDBDatabase.close db
339− db <- IDBFactory.open "db" (Just 999) { onUpgradeNeeded : Just (onUpgradeNeeded var)
346+ db' <- IDBFactory.open "db" (Just 999) { onUpgradeNeeded : Just (onUpgradeNeeded var)
340347 , onBlocked : Nothing
341348 }
342349 deleted <- takeVar var
343350 deleted `shouldEqual` true
344− tearDown db
351+ tearDown db'
345352
346353
347354 describe "IDBObjectStore" do
@@ -355,9 +362,9 @@ main = runMocha do
355362 let onUpgradeNeeded' var db _ _ = launchAff' do
356363 store <- IDBDatabase.createObjectStore db "store" storeParams
357364 liftEff $ maybe (pure unit) id (onUpgradeNeeded <*> pure db <*> pure store)
358− putVar var { db, store }
365+ putVar { db, store } var
359366
360− var <- makeVar
367+ var <- makeEmptyVar
361368 db <- IDBFactory.open "db" Nothing
362369 { onUpgradeNeeded : Just (onUpgradeNeeded' var)
363370 , onBlocked : Nothing
@@ -375,24 +382,24 @@ main = runMocha do
375382 (toKey 1) `shouldEqual` key
376383
377384 -- int key
378− key <- IDBObjectStore.add store "patate" (Just 14)
379− (toKey 14) `shouldEqual` key
385+ key' <- IDBObjectStore.add store "patate" (Just 14)
386+ (toKey 14) `shouldEqual` key'
380387
381388 -- number key
382− key <- IDBObjectStore.add store "patate" (Just 14.42)
383− (toKey 14.42) `shouldEqual` key
389+ key'' <- IDBObjectStore.add store "patate" (Just 14.42)
390+ (toKey 14.42) `shouldEqual` key''
384391
385392 -- string key
386− key <- IDBObjectStore.add store "patate" (Just "key")
387− (toKey "key") `shouldEqual` key
393+ key''' <- IDBObjectStore.add store "patate" (Just "key")
394+ (toKey "key") `shouldEqual` key'''
388395
389396 -- date key
390− key <- IDBObjectStore.add store "patate" (Just date)
391− (toKey date) `shouldEqual` key
397+ key'''' <- IDBObjectStore.add store "patate" (Just date)
398+ (toKey date) `shouldEqual` key''''
392399
393400 -- array key
394− key <- IDBObjectStore.add store "patate" (Just $ toKey [14, 42])
395− (toKey [14, 42]) `shouldEqual` key
401+ key''''' <- IDBObjectStore.add store "patate" (Just $ toKey [14, 42])
402+ (toKey [14, 42]) `shouldEqual` key'''''
396403 }
397404 tearDown db
398405
@@ -411,8 +418,8 @@ main = runMocha do
411418 { db } <- setup
412419 { storeParams: IDBDatabase.defaultParameters
413420 , onUpgradeNeeded: Just $ \_ store -> launchAff' do
414− key <- IDBObjectStore.add store "patate" (Just 14)
415− key <- IDBObjectStore.add store "autruche" (Just 42)
421+ _ <- IDBObjectStore.add store "patate" (Just 14)
422+ _ <- IDBObjectStore.add store "autruche" (Just 42)
416423 n <- IDBObjectStore.count store Nothing
417424 n `shouldEqual` 2
418425 }
@@ -426,8 +433,8 @@ main = runMocha do
426433 mkey <- IDBObjectStore.getKey store (IDBKeyRange.only 14)
427434 mkey `shouldEqual` (Just key)
428435
429− mkey <- IDBObjectStore.getKey store (IDBKeyRange.only 42)
430− mkey `shouldEqual` none
436+ mkey' <- IDBObjectStore.getKey store (IDBKeyRange.only 42)
437+ mkey' `shouldEqual` none
431438 }
432439 tearDown db
433440
@@ -444,16 +451,16 @@ main = runMocha do
444451 keys `shouldEqual` [key1, key2, key3]
445452
446453 -- lower bound
447− keys <- IDBObjectStore.getAllKeys store (Just $ IDBKeyRange.lowerBound 14 true) Nothing
448− keys `shouldEqual` [key2, key3]
454+ keys' <- IDBObjectStore.getAllKeys store (Just $ IDBKeyRange.lowerBound 14 true) Nothing
455+ keys' `shouldEqual` [key2, key3]
449456
450457 -- upper bound
451− keys <- IDBObjectStore.getAllKeys store (Just $ IDBKeyRange.upperBound 42 false) Nothing
452− keys `shouldEqual` [key1, key2]
458+ keys'' <- IDBObjectStore.getAllKeys store (Just $ IDBKeyRange.upperBound 42 false) Nothing
459+ keys'' `shouldEqual` [key1, key2]
453460
454461 -- count
455− keys <- IDBObjectStore.getAllKeys store (Just $ IDBKeyRange.lowerBound 1 true) (Just 2)
456− keys `shouldEqual` [key1, key2]
462+ keys''' <- IDBObjectStore.getAllKeys store (Just $ IDBKeyRange.lowerBound 1 true) (Just 2)
463+ keys''' `shouldEqual` [key1, key2]
457464 }
458465 tearDown db
459466
@@ -513,9 +520,9 @@ main = runMocha do
513520 _ <- traverse (uncurry (IDBObjectStore.add store)) values
514521 index <- IDBObjectStore.createIndex store "index" keyPath indexParams
515522 liftEff $ maybe (pure unit) id (onUpgradeNeeded <*> pure db <*> pure tx <*> pure index)
516− putVar var { db, index, store }
523+ putVar { db, index, store } var
517524
518− var <- makeVar
525+ var <- makeEmptyVar
519526 db <- IDBFactory.open "db" Nothing
520527 { onUpgradeNeeded : Just (onUpgradeNeeded' var)
521528 , onBlocked : Nothing
@@ -538,9 +545,9 @@ main = runMocha do
538545 tearDown db
539546
540547 it "attempt to create an index that requires unique values on an object store already contains duplicates" do
541− let onAbort var = launchAff' (putVar var true)
542− txVar <- makeVar
543− dbVar <- makeVar
548+ let onAbort var = launchAff' (putVar true var)
549+ txVar <- makeEmptyVar
550+ dbVar <- makeEmptyVar
544551 res <- attempt $ setup
545552 { storeParams : IDBDatabase.defaultParameters
546553 , indexParams : { unique : true
@@ -802,11 +809,11 @@ main = runMocha do
802809 key <- IDBIndex.getKey index (IDBKeyRange.only "patate")
803810 key `shouldEqual` (Just $ toKey 1)
804811
805− key <- IDBIndex.getKey index (IDBKeyRange.only "autruche")
806− key `shouldEqual` (Just $ toKey 1)
812+ key' <- IDBIndex.getKey index (IDBKeyRange.only "autruche")
813+ key' `shouldEqual` (Just $ toKey 1)
807814
808− key <- IDBIndex.getKey index (IDBKeyRange.only "bob")
809− key `shouldEqual` (Just $ toKey 2)
815+ key'' <- IDBIndex.getKey index (IDBKeyRange.only "bob")
816+ key'' `shouldEqual` (Just $ toKey 2)
810817 }
811818 tearDown db
812819
@@ -851,9 +858,9 @@ main = runMocha do
851858 _ <- traverse (uncurry (IDBObjectStore.add store)) values
852859 index <- IDBObjectStore.createIndex store "index" keyPath indexParams
853860 liftEff $ maybe (pure unit) id (onUpgradeNeeded <*> pure db <*> pure tx <*> pure index)
854− putVar var { db, index, store }
861+ putVar { db, index, store } var
855862
856− var <- makeVar
863+ var <- makeEmptyVar
857864 db <- IDBFactory.open "db" Nothing
858865 { onUpgradeNeeded : Just (onUpgradeNeeded' var)
859866 , onBlocked : Nothing
@@ -874,7 +881,7 @@ main = runMocha do
874881 }
875882 let cb vdone vvals =
876883 { onComplete: launchAff' do
877− putVar vdone unit
884+ putVar unit vdone
878885
879886 , onError: \error -> launchAff' do
880887 fail $ "unexpected error: " <> show error
@@ -883,11 +890,11 @@ main = runMocha do
883890 vals <- takeVar vvals
884891 pure (IDBCursor.value cursor) >>= shouldEqual (maybe "" _.v $ head vals)
885892 IDBCursor.primaryKey cursor >>= shouldEqual (maybe (toKey 0) _.k $ head vals)
886− putVar vvals (drop 1 vals)
893+ putVar (drop 1 vals) vvals
887894 IDBCursor.continue cursor none
888895 }
889− vdone <- makeVar
890− vvals <- makeVar'
896+ vdone <- makeEmptyVar
897+ vvals <- makeVar
891898 [ { v: "pie" , k: toKey 1 }
892899 , { v: "pancake", k: toKey 2 }
893900 , { v: "pie" , k: toKey 3 }
@@ -923,11 +930,11 @@ main = runMocha do
923930 case res of
924931 Left err -> do
925932 name err `shouldEqual` "DataError"
926− putVar vdone unit
933+ putVar unit vdone
927934 Right _ -> do
928935 fail "expected continue to fail"
929936 }
930− vdone <- makeVar
937+ vdone <- makeEmptyVar
931938 tx <- IDBDatabase.transaction db ["store"] ReadOnly
932939 store <- IDBTransaction.objectStore tx "store"
933940 IDBObjectStore.openCursor store Nothing Next (cb vdone)
@@ -949,7 +956,7 @@ main = runMocha do
949956 }
950957 let cb vdone vjump =
951958 { onComplete: launchAff' do
952− putVar vdone unit
959+ putVar unit vdone
953960
954961 , onError: \error -> launchAff' do
955962 fail $ "unexpected error: " <> show error
@@ -964,10 +971,10 @@ main = runMocha do
964971 value.pKey `shouldEqual` "pkey_3"
965972 value.iKey `shouldEqual` "ikey_3"
966973 IDBCursor.continue cursor none
967− putVar vjump false
974+ putVar false vjump
968975 }
969− vdone <- makeVar
970− vjump <- makeVar' true
976+ vdone <- makeEmptyVar
977+ vjump <- makeVar true
971978 tx <- IDBDatabase.transaction db ["store"] ReadOnly
972979 store <- IDBTransaction.objectStore tx "store"
973980 IDBObjectStore.openCursor store Nothing Next (cb vdone vjump)
@@ -990,7 +997,7 @@ main = runMocha do
990997 { onComplete: launchAff' do
991998 mval <- map _.pKey <$> IDBIndex.get store (IDBKeyRange.only "pkey_0")
992999 mval `shouldEqual` (Nothing :: Maybe String)
993− putVar vdone unit
1000+ putVar unit vdone
9941001
9951002 , onError: \error -> launchAff' do
9961003 fail $ "unexpected error: " <> show error
@@ -1001,7 +1008,7 @@ main = runMocha do
10011008 IDBCursor.delete cursor
10021009 IDBCursor.advance cursor 4
10031010 }
1004− vdone <- makeVar
1011+ vdone <- makeEmptyVar
10051012 tx <- IDBDatabase.transaction db ["store"] ReadWrite
10061013 store <- IDBTransaction.objectStore tx "store"
10071014 IDBObjectStore.openCursor store Nothing Next (cb vdone store)
@@ -1021,7 +1028,7 @@ main = runMocha do
10211028 { onComplete: launchAff' do
10221029 mval <- map _.iKey <$> IDBIndex.get store (IDBKeyRange.only "pkey_0")
10231030 mval `shouldEqual` (Just "patate")
1024− putVar vdone unit
1031+ putVar unit vdone
10251032
10261033 , onError: \error -> launchAff' do
10271034 fail $ "unexpected error: " <> show error
@@ -1033,7 +1040,7 @@ main = runMocha do
10331040 key `shouldEqual` toKey "pkey_0"
10341041 IDBCursor.advance cursor 4
10351042 }
1036− vdone <- makeVar
1043+ vdone <- makeEmptyVar
10371044 tx <- IDBDatabase.transaction db ["store"] ReadWrite
10381045 store <- IDBTransaction.objectStore tx "store"
10391046 IDBObjectStore.openCursor store Nothing Next (cb vdone store)
@@ -1061,11 +1068,11 @@ main = runMocha do
10611068 case res of
10621069 Left err -> do
10631070 name err `shouldEqual` "ReadOnlyError"
1064− putVar vdone unit
1071+ putVar unit vdone
10651072 Right _ ->
10661073 fail $ "expected ReadOnlyError"
10671074 }
1068− vdone <- makeVar
1075+ vdone <- makeEmptyVar
10691076 tx <- IDBDatabase.transaction db ["store"] ReadOnly
10701077 store <- IDBTransaction.objectStore tx "store"
10711078 IDBObjectStore.openCursor store Nothing Next (cb vdone)