git.iko.soy/purescript-indexed-DB
on 12918e4 help sign in
.gitignore−2
since splitsnapshots
unifiedsplit
@@ -77,5 +77,3 @@ releases
77.purs*
77.purs*
78.psa*
78.psa*
79dist
79dist
80−.spago
81−test.js
bower.jsonnew file+44
@@ -0,0 +1,44 @@
1+{
2+ "name": "purescript-indexeddb",
3+ "description": "An API wrapper around IndexedDB",
4+ "version": "3.0.0",
5+ "authors": [
6+ "Matthias Benkort <matthias.benkort@gmail.com>"
7+ ],
8+ "ignore": [
9+ "**/.*",
10+ "node_modules",
11+ "bower_components",
12+ "output",
13+ "test",
14+ "dist",
15+ "releases",
16+ "package.json",
17+ "karma.conf.js",
18+ "karma.browserstack.conf.js",
19+ "deploy.sh"
20+ ],
21+ "license": "MIT",
22+ "homepage": "https://github.com/truqu/purescript-indexedDB",
23+ "repository": {
24+ "type": "git",
25+ "url": "git://github.com/truqu/purescript-indexedDB.git"
26+ },
27+ "dependencies": {
28+ "purescript-aff": "^4.0.2",
29+ "purescript-datetime": "^3.2.0",
30+ "purescript-eff": "^3.1.0",
31+ "purescript-exceptions": "^3.0.0",
32+ "purescript-foreign": "^4.0.1",
33+ "purescript-maybe": "^3.0.0",
34+ "purescript-nullable": "^3.0.0",
35+ "purescript-prelude": "^3.1.0",
36+ "purescript-read": "^1.0.0"
37+ },
38+ "devDependencies": {
39+ "purescript-now": "^3.0.0",
40+ "purescript-psci-support": "^3.0.0",
41+ "purescript-spec": "^2.0.0",
42+ "purescript-spec-mocha": "^2.0.0"
43+ }
44+}
deploy.shnew file+6
@@ -0,0 +1,6 @@
1+#!/bin/sh
2+
3+git stash save
4+git clean -df
5+yes | pulp publish --no-push
6+git stash pop
index.jsdeleted−4
@@ -1,4 +0,0 @@
1−import "fake-indexeddb/auto";
2−import * as Main from './output/Test.Main/index.js';
3−
4−Main.main();
karma.browserstack.conf.jsnew file+91
@@ -0,0 +1,91 @@
1+module.exports = (config) => {
2+ config.set({
3+ browsers: [
4+ 'FirefoxMAC',
5+ 'ChromeMAC',
6+ // 'SafariMAC',
7+ 'OperaMAC',
8+
9+ 'FirefoxWIN',
10+ 'ChromeWIN',
11+ 'OperaWIN',
12+ ],
13+ files: [
14+ 'dist/karma/index.js',
15+ ],
16+ frameworks: [
17+ 'mocha',
18+ ],
19+ plugins: [
20+ 'karma-browserstack-launcher',
21+ 'karma-mocha',
22+ ],
23+ reporters: [
24+ 'dots',
25+ 'BrowserStack',
26+ ],
27+ singleRun: true,
28+ client: {
29+ mocha: {
30+ timeout: 10000,
31+ },
32+ },
33+ browserStack: {
34+ username: process.env.BROWSERSTACK_USERNAME,
35+ accessKey: process.env.BROWSERSTACK_ACCESSKEY,
36+ timeout: 1500,
37+ captureTimeout: 500,
38+ },
39+ customLaunchers: {
40+ FirefoxMAC: {
41+ base: 'BrowserStack',
42+ browser: 'Firefox',
43+ browser_version: '51',
44+ os: 'OS X',
45+ os_version: 'Sierra',
46+ },
47+ ChromeMAC: {
48+ base: 'BrowserStack',
49+ browser: 'Chrome',
50+ browser_version: '58',
51+ os: 'OS X',
52+ os_version: 'Sierra',
53+ },
54+ SafariMAC: {
55+ base: 'BrowserStack',
56+ browser: 'Safari',
57+ browser_version: '10.1',
58+ os: 'OS X',
59+ os_version: 'Sierra',
60+ },
61+ OperaMAC: {
62+ base: 'BrowserStack',
63+ browser: 'Opera',
64+ browser_version: '46',
65+ os: 'OS X',
66+ os_version: 'Sierra',
67+ },
68+ FirefoxWIN: {
69+ base: 'BrowserStack',
70+ browser: 'Firefox',
71+ browser_version: '51',
72+ os: 'WINDOWS',
73+ os_version: '10',
74+ },
75+ ChromeWIN: {
76+ base: 'BrowserStack',
77+ browser: 'Chrome',
78+ browser_version: '58',
79+ os: 'WINDOWS',
80+ os_version: '10',
81+ },
82+ OperaWIN: {
83+ base: 'BrowserStack',
84+ browser: 'Opera',
85+ browser_version: '46',
86+ os: 'WINDOWS',
87+ os_version: '10',
88+ },
89+ },
90+ });
91+};
karma.conf.jsnew file+25
@@ -0,0 +1,25 @@
1+module.exports = config => {
2+ config.set({
3+ autoWatch: true,
4+ singleRun: true,
5+ browsers: ["Chrome", "Firefox"],
6+ files: [
7+ "dist/karma/index.js",
8+ ],
9+ frameworks: [
10+ "mocha",
11+ ],
12+ plugins: [
13+ "karma-chrome-launcher",
14+ "karma-firefox-launcher",
15+ "karma-spec-reporter",
16+ "karma-mocha",
17+ ],
18+ reporters: ["spec"],
19+ client: {
20+ mocha: {
21+ timeout: 10000
22+ }
23+ }
24+ });
25+};
package.json+37−10
@@ -1,15 +1,42 @@
1{
1{
2− "name": "purescript-indexed-DB",
2+ "name": "purescript-indexeddb",
3− "version": "1.0.0",
3+ "version": "3.0.0",
4− "main": "index.js",
4+ "description": "A wrapper around the IndexedDB API",
5− "repository": "https://github.com/ilyakooo0/purescript-indexed-DB.git",
6− "author": "iko <mail@iko.soy>",
7− "license": "MIT",
8 "scripts": {
5 "scripts": {
9− "test": "spago build && node index.js"
6+ "prepare:release": "mkdir -p releases/github && cp -r README.md LICENSE src bower.json releases/github",
7+ "test:build": "mkdir -p dist/karma && pulp browserify -j 4 --main \"Test.Main\" -I test --to dist/karma/index.js",
8+ "test:run": "karma start karma.conf.js",
9+ "test:run:browserstack": "karma start karma.browserstack.conf.js",
10+ "test:browserstack": "npm run test:build && npm run test:run:browserstack",
11+ "test": "npm run test:build && npm run test:run",
12+ "start": "find . -type f -regex '.*\\(src\\|test\\).*' ! -regex '.*bower_components.*\\|.*node_modules.*|.*\\.sw.*' | entr -s 'npm run test -s'"
13+ },
14+ "dependencies": {},
15+ "devDependencies": {
16+ "bower": "1.8.0",
17+ "eslint": "3.19.0",
18+ "eslint-config-airbnb": "15.0.1",
19+ "eslint-plugin-import": "2.5.0",
20+ "eslint-plugin-jsx-a11y": "5.0.3",
21+ "eslint-plugin-react": "7.1.0",
22+ "karma": "1.7.0",
23+ "karma-browserstack-launcher": "1.3.0",
24+ "karma-chrome-launcher": "2.1.1",
25+ "karma-firefox-launcher": "1.0.1",
26+ "karma-mocha": "1.3.0",
27+ "karma-spec-reporter": "0.0.31",
28+ "mocha": "3.4.2",
29+ "pulp": "11.0.0",
30+ "purescript": "0.11.5"
10 },
31 },
11− "dependencies": {
32+ "repository": {
12− "fake-indexeddb": "^4.0.1"
33+ "type": "git",
34+ "url": "git+https://github.com/Truqu/purescript-indexeddb.git"
35+ },
36+ "author": "Matthias Benkort <matthias.benkort@truqu.com>",
37+ "license": "MIT",
38+ "bugs": {
39+ "url": "https://github.com/Truqu/purescript-indexeddb/issues"
13 },
40 },
14− "type": "module"
41+ "homepage": "https://github.com/Truqu/purescript-indexeddb#readme"
15}
42}
packages.dhalldeleted−105
@@ -1,105 +0,0 @@
1−{-
2−Welcome to your new Dhall package-set!
3−
4−Below are instructions for how to edit this file for most use
5−cases, so that you don't need to know Dhall to use it.
6−
7−## Use Cases
8−
9−Most will want to do one or both of these options:
10−1. Override/Patch a package's dependency
11−2. Add a package not already in the default package set
12−
13−This file will continue to work whether you use one or both options.
14−Instructions for each option are explained below.
15−
16−### Overriding/Patching a package
17−
18−Purpose:
19−- Change a package's dependency to a newer/older release than the
20− default package set's release
21−- Use your own modified version of some dependency that may
22− include new API, changed API, removed API by
23− using your custom git repo of the library rather than
24− the package set's repo
25−
26−Syntax:
27−where `entityName` is one of the following:
28−- dependencies
29−- repo
30−- version
31−-------------------------------
32−let upstream = --
33−in upstream
34− with packageName.entityName = "new value"
35−-------------------------------
36−
37−Example:
38−-------------------------------
39−let upstream = --
40−in upstream
41− with halogen.version = "master"
42− with halogen.repo = "https://example.com/path/to/git/repo.git"
43−
44− with halogen-vdom.version = "v4.0.0"
45− with halogen-vdom.dependencies = [ "extra-dependency" ] # halogen-vdom.dependencies
46−-------------------------------
47−
48−### Additions
49−
50−Purpose:
51−- Add packages that aren't already included in the default package set
52−
53−Syntax:
54−where `<version>` is:
55−- a tag (i.e. "v4.0.0")
56−- a branch (i.e. "master")
57−- commit hash (i.e. "701f3e44aafb1a6459281714858fadf2c4c2a977")
58−-------------------------------
59−let upstream = --
60−in upstream
61− with new-package-name =
62− { dependencies =
63− [ "dependency1"
64− , "dependency2"
65− ]
66− , repo =
67− "https://example.com/path/to/git/repo.git"
68− , version =
69− "<version>"
70− }
71−-------------------------------
72−
73−Example:
74−-------------------------------
75−let upstream = --
76−in upstream
77− with benchotron =
78− { dependencies =
79− [ "arrays"
80− , "exists"
81− , "profunctor"
82− , "strings"
83− , "quickcheck"
84− , "lcg"
85− , "transformers"
86− , "foldable-traversable"
87− , "exceptions"
88− , "node-fs"
89− , "node-buffer"
90− , "node-readline"
91− , "datetime"
92− , "now"
93− ]
94− , repo =
95− "https://github.com/hdgarrood/purescript-benchotron.git"
96− , version =
97− "v7.0.0"
98− }
99−-------------------------------
100−-}
101−
102−let upstream =
103− https://github.com/purescript/package-sets/releases/download/psc-0.15.4-20221124/packages.dhall
104− sha256:792255bbd8e2141468d967325f3e78246cb7e500bf3ab6d76d5b22dffbb09d49
105−in upstream
spago.dhalldeleted−42
@@ -1,42 +0,0 @@
1−{-
2−Welcome to a Spago project!
3−You can edit this file as you like.
4−
5−Need help? See the following resources:
6−- Spago documentation: https://github.com/purescript/spago
7−- Dhall language tour: https://docs.dhall-lang.org/tutorials/Language-Tour.html
8−
9−When creating a new Spago project, you can use
10−`spago init --no-comments` or `spago init -C`
11−to generate this file without the comments in this block.
12−-}
13−{ name = "indexed-db"
14−, dependencies =
15− [ "aff"
16− , "arrays"
17− , "avar"
18− , "console"
19− , "control"
20− , "datetime"
21− , "effect"
22− , "either"
23− , "enums"
24− , "exceptions"
25− , "foldable-traversable"
26− , "foreign"
27− , "functions"
28− , "identity"
29− , "lists"
30− , "maybe"
31− , "nonempty"
32− , "now"
33− , "nullable"
34− , "prelude"
35− , "read"
36− , "spec"
37− , "transformers"
38− , "tuples"
39− ]
40−, packages = ./packages.dhall
41−, sources = [ "src/**/*.purs", "test/**/*.purs" ]
42−}
src/Database/IndexedDB/Core.js+6−6
@@ -3,7 +3,7 @@ const toArray = function toArray(xs) {
3};
3};
4
4
5
5
6−export function _showCursor(cursor) {
6+exports._showCursor = function _showCursor(cursor) {
7 return '(IDBCursor ' +
7 return '(IDBCursor ' +
8 '{ direction: ' + cursor.direction +
8 '{ direction: ' + cursor.direction +
9 ', key: ' + cursor.key +
9 ', key: ' + cursor.key +
@@ -11,7 +11,7 @@ export function _showCursor(cursor) {
11 ' })';
11 ' })';
12};
12};
13
13
14−export function _showDatabase(db) {
14+exports._showDatabase = function _showDatabase(db) {
15 return '(IDBDatabase ' +
15 return '(IDBDatabase ' +
16 '{ name: ' + db.name +
16 '{ name: ' + db.name +
17 ', objectStoreNames: [' + toArray(db.objectStoreNames).join(', ') + ']' +
17 ', objectStoreNames: [' + toArray(db.objectStoreNames).join(', ') + ']' +
@@ -19,7 +19,7 @@ export function _showDatabase(db) {
19 ' })';
19 ' })';
20};
20};
21
21
22−export function _showIndex(index) {
22+exports._showIndex = function _showIndex(index) {
23 return '(IDBIndex ' +
23 return '(IDBIndex ' +
24 '{ name: ' + index.name +
24 '{ name: ' + index.name +
25 ', keyPath: ' + index.keyPath +
25 ', keyPath: ' + index.keyPath +
@@ -28,7 +28,7 @@ export function _showIndex(index) {
28 ' })';
28 ' })';
29};
29};
30
30
31−export function _showKeyRange(range) {
31+exports._showKeyRange = function _showKeyRange(range) {
32 return '(IDBKeyRange ' +
32 return '(IDBKeyRange ' +
33 '{ lower: ' + range.lower +
33 '{ lower: ' + range.lower +
34 ', upper: ' + range.upper +
34 ', upper: ' + range.upper +
@@ -37,7 +37,7 @@ export function _showKeyRange(range) {
37 ' })';
37 ' })';
38};
38};
39
39
40−export function _showObjectStore(store) {
40+exports._showObjectStore = function _showObjectStore(store) {
41 return '(IDBObjectStore ' +
41 return '(IDBObjectStore ' +
42 '{ autoIncrement: ' + store.autoIncrement +
42 '{ autoIncrement: ' + store.autoIncrement +
43 ', indexNames: [' + toArray(store.indexNames).join(', ') + ']' +
43 ', indexNames: [' + toArray(store.indexNames).join(', ') + ']' +
@@ -46,7 +46,7 @@ export function _showObjectStore(store) {
46 ' })';
46 ' })';
47};
47};
48
48
49−export function _showTransaction(tx) {
49+exports._showTransaction = function _showTransaction(tx) {
50 return '(IDBTransaction ' +
50 return '(IDBTransaction ' +
51 '{ error: ' + tx.error +
51 '{ error: ' + tx.error +
52 ', mode: ' + tx.mode +
52 ', mode: ' + tx.mode +
src/Database/IndexedDB/Core.purs+74−21
@@ -2,11 +2,10 @@
2-- | those types.
2-- | those types.
3module Database.IndexedDB.Core
3module Database.IndexedDB.Core
4 -- * Effects
4 -- * Effects
5− (
6− -- IDB
5+ ( IDB
7
6
8− -- * Types
7+ -- * Types
9− Database
8+ , Database
10 , Index
9 , Index
11 , KeyCursor
10 , KeyCursor
12 , KeyRange
11 , KeyRange
@@ -31,13 +30,23 @@ module Database.IndexedDB.Core
31 , module Database.IndexedDB.IDBKey
30 , module Database.IndexedDB.IDBKey
32 ) where
31 ) where
33
32
34−import Prelude (class Show)
33+import Prelude (class Show)
35
34
35+import Control.Monad.Eff (kind Effect)
36−import Data.Maybe (Maybe(..))
36+import Data.Maybe (Maybe(..))
37−import Data.String.Read (class Read)
37+import Data.String.Read (class Read)
38
38
39import Database.IndexedDB.IDBKey
39import Database.IndexedDB.IDBKey
40
40
41+
42+--------------------
43+-- Effects
44+--
45+
46+-- | IDB Effects, manifestation that something happened with the IndexedDB
47+foreign import data IDB :: Effect
48+
49+
41--------------------
50--------------------
42-- TYPES
51-- TYPES
43--
52--
@@ -46,28 +55,35 @@ import Database.IndexedDB.IDBKey
46-- | stores which hold the data stored in the database.
55-- | stores which hold the data stored in the database.
47foreign import data Database :: Type
56foreign import data Database :: Type
48
57
58+
49-- | An index allows looking up records in an object store using properties of the values
59-- | An index allows looking up records in an object store using properties of the values
50-- | in the object stores records.
60-- | in the object stores records.
51foreign import data Index :: Type
61foreign import data Index :: Type
52
62
63+
53-- | A key range is a continuous interval over some data type used for keys.
64-- | A key range is a continuous interval over some data type used for keys.
54foreign import data KeyRange :: Type
65foreign import data KeyRange :: Type
55
66
67+
56-- | A cursor is used to iterate over a range of records in an index or an object store
68-- | A cursor is used to iterate over a range of records in an index or an object store
57-- | in a specific direction. A KeyCursor doesn't hold any value.
69-- | in a specific direction. A KeyCursor doesn't hold any value.
58foreign import data KeyCursor :: Type
70foreign import data KeyCursor :: Type
59
71
72+
60-- | A Transaction is used to interact with the data in a database.
73-- | A Transaction is used to interact with the data in a database.
61-- | Whenever data is read or written to the database it is done by using a transaction.
74-- | Whenever data is read or written to the database it is done by using a transaction.
62foreign import data Transaction :: Type
75foreign import data Transaction :: Type
63
76
77+
64-- | An object store is the primary storage mechanism for storing data in a database.
78-- | An object store is the primary storage mechanism for storing data in a database.
65foreign import data ObjectStore :: Type
79foreign import data ObjectStore :: Type
66
80
81+
67-- | A cursor is used to iterate over a range of records in an index or an object store
82-- | A cursor is used to iterate over a range of records in an index or an object store
68-- | in a specific direction. A ValueCursor also holds the value corresponding to matching key.
83-- | in a specific direction. A ValueCursor also holds the value corresponding to matching key.
69foreign import data ValueCursor :: Type
84foreign import data ValueCursor :: Type
70
85
86+
71-- | A cursor has a direction that determines whether it moves in monotonically
87-- | A cursor has a direction that determines whether it moves in monotonically
72-- | increasing or decreasing order of the record keys when iterated, and if it
88-- | increasing or decreasing order of the record keys when iterated, and if it
73-- | skips duplicated values when iterating indexes.
89-- | skips duplicated values when iterating indexes.
@@ -79,6 +95,7 @@ data CursorDirection
79 | Prev
95 | Prev
80 | PrevUnique
96 | PrevUnique
81
97
98+
82-- | If the source of a cursor is an object store, the effective object store of
99-- | If the source of a cursor is an object store, the effective object store of
83-- | the cursor is that object store and the effective key of the cursor is the
100-- | the cursor is that object store and the effective key of the cursor is the
84-- | cursor’s position. If the source of a cursor is an index, the effective object
101-- | cursor’s position. If the source of a cursor is an index, the effective object
@@ -88,6 +105,7 @@ data CursorSource
88 = ObjectStore ObjectStore
105 = ObjectStore ObjectStore
89 | Index Index
106 | Index Index
90
107
108+
91-- | A key path is a list of strings that defines how to extract a key from a value.
109-- | A key path is a list of strings that defines how to extract a key from a value.
92-- | A valid key path is one of:
110-- | A valid key path is one of:
93-- |
111-- |
@@ -97,13 +115,15 @@ data CursorSource
97-- | - A non-empty list containing only strings conforming to the above requirements.
115-- | - A non-empty list containing only strings conforming to the above requirements.
98type KeyPath = Array String
116type KeyPath = Array String
99
117
118+
100-- | A transaction has a mode that determines which types of interactions can be performed
119-- | A transaction has a mode that determines which types of interactions can be performed
101-- | upon that transaction. The mode is set when the transaction is created and remains
120-- | upon that transaction. The mode is set when the transaction is created and remains
102-- | fixed for the life of the transaction.
121-- | fixed for the life of the transaction.
103data TransactionMode
122data TransactionMode
104− = ReadOnly -- ^ The transaction is only allowed to read data.
123+ = ReadOnly -- ^ The transaction is only allowed to read data.
105− | ReadWrite -- ^ The transaction is allowed to read, modify and delete data from existing object stores
124+ | ReadWrite -- ^ The transaction is allowed to read, modify and delete data from existing object stores
106− | VersionChange -- ^ The transaction is allowed to read, modify and delete data from existing object stores, and can also create and remove object stores and indexes.
125+ | VersionChange -- ^ The transaction is allowed to read, modify and delete data from existing object stores, and can also create and remove object stores and indexes.
126+
107
127
108--------------------
128--------------------
109-- Classes
129-- Classes
@@ -113,104 +133,132 @@ data TransactionMode
113-- | specific attributes (see KeyCursor or CursorWithValue).
133-- | specific attributes (see KeyCursor or CursorWithValue).
114class (IDBCursor cursor) <= IDBConcreteCursor cursor
134class (IDBCursor cursor) <= IDBConcreteCursor cursor
115
135
136+
116-- | Cursor objects implement the IDBCursor interface.
137-- | Cursor objects implement the IDBCursor interface.
117-- | There is only ever one IDBCursor instance representing a given cursor.
138-- | There is only ever one IDBCursor instance representing a given cursor.
118-- | There is no limit on how many cursors can be used at the same time.
139-- | There is no limit on how many cursors can be used at the same time.
119class IDBCursor cursor
140class IDBCursor cursor
120
141
142+
121-- | The IDBDatabase interface represents a connection to a database.
143-- | The IDBDatabase interface represents a connection to a database.
122class IDBDatabase db
144class IDBDatabase db
123
145
146+
124-- | The IDBIndex interface represents an index handle.
147-- | The IDBIndex interface represents an index handle.
125-- | Any of these methods throw an "TransactionInactiveError" DOMException
148-- | Any of these methods throw an "TransactionInactiveError" DOMException
126-- | if called when the transaction is not active.
149-- | if called when the transaction is not active.
127class IDBIndex index
150class IDBIndex index
128
151
152+
129-- | The IDBKeyRange interface represents a key range.
153-- | The IDBKeyRange interface represents a key range.
130class IDBKeyRange range
154class IDBKeyRange range
131
155
156+
132-- | The IDBtransaction interface.
157-- | The IDBtransaction interface.
133class IDBTransaction tx
158class IDBTransaction tx
134
159
160+
135-- | The IDBObjectStore interface represents an object store handle.
161-- | The IDBObjectStore interface represents an object store handle.
136class IDBObjectStore store
162class IDBObjectStore store
137
163
164+
138--------------------
165--------------------
139-- INSTANCES
166-- INSTANCES
140--
167--
141
168
142instance idbCursorKeyCursor :: IDBCursor KeyCursor
169instance idbCursorKeyCursor :: IDBCursor KeyCursor
143
170
171+
144instance idbCursorValueCursor :: IDBCursor ValueCursor
172instance idbCursorValueCursor :: IDBCursor ValueCursor
145
173
174+
146instance idbConcreteCursorKeyCursor :: IDBConcreteCursor KeyCursor
175instance idbConcreteCursorKeyCursor :: IDBConcreteCursor KeyCursor
147
176
177+
148instance idbConcreteCursorValueCursor :: IDBConcreteCursor ValueCursor
178instance idbConcreteCursorValueCursor :: IDBConcreteCursor ValueCursor
149
179
180+
150instance idbDatabaseDatabase :: IDBDatabase Database
181instance idbDatabaseDatabase :: IDBDatabase Database
151
182
183+
152instance idbIndexIndex :: IDBIndex Index
184instance idbIndexIndex :: IDBIndex Index
153
185
186+
154instance idbIndexObjectStore :: IDBIndex ObjectStore
187instance idbIndexObjectStore :: IDBIndex ObjectStore
155
188
189+
156instance idbKeyRangeKeyRange :: IDBKeyRange KeyRange
190instance idbKeyRangeKeyRange :: IDBKeyRange KeyRange
157
191
192+
158instance idbObjectStoreObjectStore :: IDBObjectStore ObjectStore
193instance idbObjectStoreObjectStore :: IDBObjectStore ObjectStore
159
194
195+
160instance idbTransactionTransaction :: IDBTransaction Transaction
196instance idbTransactionTransaction :: IDBTransaction Transaction
161
197
198+
162instance showKeyCursor :: Show KeyCursor where
199instance showKeyCursor :: Show KeyCursor where
163 show = _showCursor
200 show = _showCursor
164
201
202+
165instance showValueCursor :: Show ValueCursor where
203instance showValueCursor :: Show ValueCursor where
166 show = _showCursor
204 show = _showCursor
167
205
206+
168instance showIndex :: Show Index where
207instance showIndex :: Show Index where
169 show = _showIndex
208 show = _showIndex
170
209
210+
171instance showKeyRange :: Show KeyRange where
211instance showKeyRange :: Show KeyRange where
172 show = _showKeyRange
212 show = _showKeyRange
173
213
214+
174instance showObjectStore :: Show ObjectStore where
215instance showObjectStore :: Show ObjectStore where
175 show = _showObjectStore
216 show = _showObjectStore
176
217
218+
177instance showTransaction :: Show Transaction where
219instance showTransaction :: Show Transaction where
178 show = _showTransaction
220 show = _showTransaction
179
221
222+
180instance showDatabase :: Show Database where
223instance showDatabase :: Show Database where
181 show = _showDatabase
224 show = _showDatabase
182
225
226+
183instance showCursorDirection :: Show CursorDirection where
227instance showCursorDirection :: Show CursorDirection where
184 show x =
228 show x =
185 case x of
229 case x of
186− Next -> "next"
230+ Next -> "next"
187 NextUnique -> "nextunique"
231 NextUnique -> "nextunique"
188− Prev -> "prev"
232+ Prev -> "prev"
189 PrevUnique -> "prevunique"
233 PrevUnique -> "prevunique"
190
234
235+
191instance showTransactionMode :: Show TransactionMode where
236instance showTransactionMode :: Show TransactionMode where
192 show x =
237 show x =
193 case x of
238 case x of
194− ReadOnly -> "readonly"
239+ ReadOnly -> "readonly"
195− ReadWrite -> "readwrite"
240+ ReadWrite -> "readwrite"
196 VersionChange -> "versionchange"
241 VersionChange -> "versionchange"
197
242
243+
198instance readCursorDirection :: Read CursorDirection where
244instance readCursorDirection :: Read CursorDirection where
199 read s =
245 read s =
200 case s of
246 case s of
201− "next" -> Just Next
247+ "next" -> Just Next
202 "nextunique" -> Just NextUnique
248 "nextunique" -> Just NextUnique
203− "prev" -> Just Prev
249+ "prev" -> Just Prev
204 "prevunique" -> Just PrevUnique
250 "prevunique" -> Just PrevUnique
205− _ -> Nothing
251+ _ -> Nothing
252+
206
253
207instance readTransactionMode :: Read TransactionMode where
254instance readTransactionMode :: Read TransactionMode where
208 read s =
255 read s =
209 case s of
256 case s of
210− "readonly" -> Just ReadOnly
257+ "readonly" -> Just ReadOnly
211− "readwrite" -> Just ReadWrite
258+ "readwrite" -> Just ReadWrite
212 "versionchange" -> Just VersionChange
259 "versionchange" -> Just VersionChange
213− _ -> Nothing
260+ _ -> Nothing
261+
214
262
215--------------------
263--------------------
216-- FFI
264-- FFI
@@ -218,25 +266,30 @@ instance readTransactionMode :: Read TransactionMode where
218
266
219foreign import _showCursor
267foreign import _showCursor
220 :: forall cursor
268 :: forall cursor
221− . cursor
269+ . cursor
222 -> String
270 -> String
223
271
272+
224foreign import _showDatabase
273foreign import _showDatabase
225 :: Database
274 :: Database
226 -> String
275 -> String
227
276
277+
228foreign import _showIndex
278foreign import _showIndex
229 :: Index
279 :: Index
230 -> String
280 -> String
231
281
282+
232foreign import _showKeyRange
283foreign import _showKeyRange
233 :: KeyRange
284 :: KeyRange
234 -> String
285 -> String
235
286
287+
236foreign import _showObjectStore
288foreign import _showObjectStore
237 :: ObjectStore
289 :: ObjectStore
238 -> String
290 -> String
239
291
292+
240foreign import _showTransaction
293foreign import _showTransaction
241 :: Transaction
294 :: Transaction
242 -> String
295 -> String
src/Database/IndexedDB/IDBCursor.js+10−10
@@ -10,7 +10,7 @@ const successHandler = function successHandler(cb) {
10 };
10 };
11};
11};
12
12
13−export function _advance(cursor, count) {
13+exports._advance = function _advance(cursor, count) {
14 return function aff(error, success) {
14 return function aff(error, success) {
15 try {
15 try {
16 cursor.advance(count);
16 cursor.advance(count);
@@ -25,7 +25,7 @@ export function _advance(cursor, count) {
25 };
25 };
26};
26};
27
27
28−export function _continue(cursor, key) {
28+exports._continue = function _continue(cursor, key) {
29 return function aff(error, success) {
29 return function aff(error, success) {
30 try {
30 try {
31 cursor.continue(key || undefined);
31 cursor.continue(key || undefined);
@@ -40,7 +40,7 @@ export function _continue(cursor, key) {
40 };
40 };
41};
41};
42
42
43−export function _continuePrimaryKey(cursor, key, primaryKey) {
43+exports._continuePrimaryKey = function _continuePrimaryKey(cursor, key, primaryKey) {
44 return function aff(error, success) {
44 return function aff(error, success) {
45 try {
45 try {
46 cursor.continuePrimaryKey(key, primaryKey);
46 cursor.continuePrimaryKey(key, primaryKey);
@@ -55,7 +55,7 @@ export function _continuePrimaryKey(cursor, key, primaryKey) {
55 };
55 };
56};
56};
57
57
58−export function _delete(cursor) {
58+exports._delete = function _delete(cursor) {
59 return function aff(error, success) {
59 return function aff(error, success) {
60 try {
60 try {
61 const request = cursor.delete();
61 const request = cursor.delete();
@@ -71,11 +71,11 @@ export function _delete(cursor) {
71 };
71 };
72};
72};
73
73
74−export function _direction(fromString, cursor) {
74+exports._direction = function _direction(fromString, cursor) {
75 return fromString(cursor.direction);
75 return fromString(cursor.direction);
76};
76};
77
77
78−export function _key(cursor) {
78+exports._key = function _key(cursor) {
79 return function aff(error, success) {
79 return function aff(error, success) {
80 try {
80 try {
81 success(cursor.key);
81 success(cursor.key);
@@ -89,7 +89,7 @@ export function _key(cursor) {
89 };
89 };
90};
90};
91
91
92−export function _primaryKey(cursor) {
92+exports._primaryKey = function _primaryKey(cursor) {
93 return function aff(error, success) {
93 return function aff(error, success) {
94 try {
94 try {
95 success(cursor.primaryKey);
95 success(cursor.primaryKey);
@@ -103,7 +103,7 @@ export function _primaryKey(cursor) {
103 };
103 };
104};
104};
105
105
106−export function _source(IDBObjectStore, IDBIndex, cursor) {
106+exports._source = function _source(IDBObjectStore, IDBIndex, cursor) {
107 switch (cursor.source.constructor.name) {
107 switch (cursor.source.constructor.name) {
108 case 'IDBIndex':
108 case 'IDBIndex':
109 return IDBIndex(cursor.source);
109 return IDBIndex(cursor.source);
@@ -123,7 +123,7 @@ export function _source(IDBObjectStore, IDBIndex, cursor) {
123 }
123 }
124};
124};
125
125
126−export function _update(cursor, value) {
126+exports._update = function _update(cursor, value) {
127 return function aff(error, success) {
127 return function aff(error, success) {
128 try {
128 try {
129 const request = cursor.update(value);
129 const request = cursor.update(value);
@@ -139,6 +139,6 @@ export function _update(cursor, value) {
139 };
139 };
140};
140};
141
141
142−export function _value(cursor) {
142+exports._value = function _value(cursor) {
143 return cursor.value;
143 return cursor.value;
144};
144};
src/Database/IndexedDB/IDBCursor.purs+85−75
@@ -16,18 +16,20 @@ module Database.IndexedDB.IDBCursor
16 , value
16 , value
17 ) where
17 ) where
18
18
19−import Database.IndexedDB.Core
19+import Prelude (Unit, ($), (>>>), (<<<), map)
20+
21+import Control.Monad.Aff (Aff)
22+import Control.Monad.Aff.Compat (fromEffFnAff, EffFnAff)
23+import Data.Foreign (Foreign, toForeign, unsafeFromForeign)
24+import Data.Function.Uncurried as Fn
25+import Data.Function.Uncurried (Fn2, Fn3)
26+import Data.Maybe (Maybe)
27+import Data.Nullable (Nullable, toNullable)
28+import Data.String.Read (read)
20
29
21−import Data.Function.Uncurried (Fn2, Fn3)
30+import Database.IndexedDB.Core
22−import Data.Function.Uncurried as Fn
23−import Data.Maybe (Maybe)
24−import Data.Nullable (Nullable, toNullable)
25−import Data.String.Read (read)
26import Database.IndexedDB.IDBKey.Internal (class IDBKey, Key, toKey, unsafeFromKey)
31import Database.IndexedDB.IDBKey.Internal (class IDBKey, Key, toKey, unsafeFromKey)
27−import Effect.Aff (Aff)
32+
28−import Effect.Aff.Compat (EffectFnAff, fromEffectFnAff)
29−import Foreign (Foreign, unsafeFromForeign, unsafeToForeign)
30−import Prelude (Unit, ($), (>>>), (<<<), map)
31
33
32--------------------
34--------------------
33-- INTERFACES
35-- INTERFACES
@@ -35,58 +37,56 @@ import Prelude (Unit, ($), (>>>), (<<<), map)
35
37
36-- | Advances the cursor through the next count records in range.
38-- | Advances the cursor through the next count records in range.
37advance
39advance
38− :: forall cursor
39− . (IDBCursor cursor)
40+ :: forall e cursor. (IDBCursor cursor)
40− => cursor
41+ => cursor
41− -> Int
42+ -> Int
42− -> Aff Unit
43+ -> Aff (idb :: IDB | e) Unit
43advance c =
44advance c =
44− fromEffectFnAff <<< Fn.runFn2 _advance c
45+ fromEffFnAff <<< Fn.runFn2 _advance c
46+
45
47
46-- | Advances the cursor to the next record in range matching or after key.
48-- | Advances the cursor to the next record in range matching or after key.
47continue
49continue
48− :: forall k cursor
49− . (IDBKey k)
50− => (IDBCursor cursor)
50+ :: forall e k cursor. (IDBKey k) => (IDBCursor cursor)
51− => cursor
51+ => cursor
52− -> Maybe k
52+ -> Maybe k
53− -> Aff Unit
53+ -> Aff (idb :: IDB | e) Unit
54continue c mk =
54continue c mk =
55− fromEffectFnAff $ Fn.runFn2 _continue c (toNullable $ map (toKey >>> unsafeFromKey) mk)
55+ fromEffFnAff $ Fn.runFn2 _continue c (toNullable $ map (toKey >>> unsafeFromKey) mk)
56+
56
57
57-- | 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.
58-- | 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.
58continuePrimaryKey
59continuePrimaryKey
59− :: forall k cursor
60− . (IDBKey k)
61− => (IDBCursor cursor)
60+ :: forall e k cursor. (IDBKey k) => (IDBCursor cursor)
62− => cursor
61+ => cursor
63− -> k
62+ -> k
64− -> k
63+ -> k
65− -> Aff Unit
64+ -> Aff (idb :: IDB | e) Unit
66continuePrimaryKey c k1 k2 =
65continuePrimaryKey c k1 k2 =
67− fromEffectFnAff $ Fn.runFn3 _continuePrimaryKey c (unsafeFromKey $ toKey k1) (unsafeFromKey $ toKey k2)
66+ fromEffFnAff $ Fn.runFn3 _continuePrimaryKey c (unsafeFromKey $ toKey k1) (unsafeFromKey $ toKey k2)
67+
68
68
69-- | Delete the record pointed at by the cursor with a new value.
69-- | Delete the record pointed at by the cursor with a new value.
70delete
70delete
71− :: forall cursor
72− . (IDBCursor cursor)
71+ :: forall e cursor. (IDBCursor cursor)
73− => cursor
72+ => cursor
74− -> Aff Unit
73+ -> Aff (idb :: IDB | e) Unit
75delete =
74delete =
76− fromEffectFnAff <<< _delete
75+ fromEffFnAff <<< _delete
76+
77
77
78-- | Update the record pointed at by the cursor with a new value.
78-- | Update the record pointed at by the cursor with a new value.
79-- |
79-- |
80-- | Throws a "DataError" DOMException if the effective object store uses
80-- | Throws a "DataError" DOMException if the effective object store uses
81-- | in-line keys and the key would have changed.
81-- | in-line keys and the key would have changed.
82update
82update
83− :: forall val cursor
83+ :: forall val e cursor. (IDBCursor cursor)
84− . (IDBCursor cursor)
85− => cursor
84+ => cursor
86− -> val
85+ -> val
87− -> Aff Key
86+ -> Aff (idb :: IDB | e) Key
88update c =
87update c =
89− map toKey <<< fromEffectFnAff <<< Fn.runFn2 _update c <<< unsafeToForeign
88+ map toKey <<< fromEffFnAff <<< Fn.runFn2 _update c <<< toForeign
89+
90
90
91--------------------
91--------------------
92-- ATTRIBUTES
92-- ATTRIBUTES
@@ -94,93 +94,103 @@ update c =
94
94
95-- | Returns the direction (Next|NextUnique|Prev|PrevUnique) of the cursor.
95-- | Returns the direction (Next|NextUnique|Prev|PrevUnique) of the cursor.
96direction
96direction
97− :: forall cursor
98− . (IDBConcreteCursor cursor)
97+ :: forall cursor. (IDBConcreteCursor cursor)
99 => cursor
98 => cursor
100 -> CursorDirection
99 -> CursorDirection
101direction =
100direction =
102 Fn.runFn2 _direction (read >>> toNullable)
101 Fn.runFn2 _direction (read >>> toNullable)
103
102
103+
104-- | Returns the key of the cursor. Throws a "InvalidStateError" DOMException
104-- | Returns the key of the cursor. Throws a "InvalidStateError" DOMException
105-- | if the cursor is advancing or is finished.
105-- | if the cursor is advancing or is finished.
106key
106key
107− :: forall cursor
108− . (IDBConcreteCursor cursor)
107+ :: forall e cursor. (IDBConcreteCursor cursor)
109 => cursor
108 => cursor
110− -> Aff Key
109+ -> Aff (idb :: IDB | e) Key
111key =
110key =
112− map toKey <<< fromEffectFnAff <<< _key
111+ map toKey <<< fromEffFnAff <<< _key
112+
113
113
114-- | Returns the effective key of the cursor. Throws a "InvalidStateError" DOMException
114-- | Returns the effective key of the cursor. Throws a "InvalidStateError" DOMException
115-- | if the cursor is advancing or is finished.
115-- | if the cursor is advancing or is finished.
116primaryKey
116primaryKey
117− :: forall cursor
118− . (IDBConcreteCursor cursor)
117+ :: forall e cursor. (IDBConcreteCursor cursor)
119 => cursor
118 => cursor
120− -> Aff Key
119+ -> Aff (idb :: IDB | e) Key
121primaryKey =
120primaryKey =
122− map toKey <<< fromEffectFnAff <<< _primaryKey
121+ map toKey <<< fromEffFnAff <<< _primaryKey
122+
123
123
124-- | Returns the IDBObjectStore or IDBIndex the cursor was opened from.
124-- | Returns the IDBObjectStore or IDBIndex the cursor was opened from.
125source
125source
126− :: forall cursor
127− . (IDBConcreteCursor cursor)
126+ :: forall cursor. (IDBConcreteCursor cursor)
128 => cursor
127 => cursor
129 -> CursorSource
128 -> CursorSource
130source =
129source =
131 Fn.runFn3 _source ObjectStore Index
130 Fn.runFn3 _source ObjectStore Index
132
131
132+
133value
133value
134 :: forall val
134 :: forall val
135− . ValueCursor
135+ . ValueCursor
136 -> val
136 -> val
137value =
137value =
138 _value >>> unsafeFromForeign
138 _value >>> unsafeFromForeign
139
139
140+
140--------------------
141--------------------
141-- FFI
142-- FFI
142--
143--
143
144
144foreign import _advance
145foreign import _advance
145− :: forall cursor
146+ :: forall cursor e
146− . Fn2 cursor Int (EffectFnAff Unit)
147+ . Fn2 cursor Int (EffFnAff (idb :: IDB | e) Unit)
148+
147
149
148foreign import _continue
150foreign import _continue
149− :: forall cursor
151+ :: forall cursor e
150− . Fn2 cursor (Nullable Foreign) (EffectFnAff Unit)
152+ . Fn2 cursor (Nullable Foreign) (EffFnAff (idb :: IDB | e) Unit)
153+
151
154
152foreign import _continuePrimaryKey
155foreign import _continuePrimaryKey
153− :: forall cursor
156+ :: forall cursor e
154− . Fn3 cursor Foreign Foreign (EffectFnAff Unit)
157+ . Fn3 cursor Foreign Foreign (EffFnAff (idb :: IDB | e) Unit)
158+
155
159
156foreign import _delete
160foreign import _delete
157− :: forall cursor
161+ :: forall cursor e
158− . cursor
162+ . cursor
159− -> (EffectFnAff Unit)
163+ -> (EffFnAff (idb :: IDB | e) Unit)
164+
160
165
161foreign import _direction
166foreign import _direction
162 :: forall cursor
167 :: forall cursor
163− . Fn2 (String -> Nullable CursorDirection) cursor CursorDirection
168+ . Fn2 (String -> Nullable CursorDirection) cursor CursorDirection
169+
164
170
165foreign import _key
171foreign import _key
166− :: forall cursor
172+ :: forall cursor e
167− . cursor
173+ . cursor
168− -> EffectFnAff Key
174+ -> EffFnAff (idb :: IDB | e) Key
175+
169
176
170foreign import _primaryKey
177foreign import _primaryKey
171− :: forall cursor
178+ :: forall cursor e
172− . cursor
179+ . cursor
173− -> EffectFnAff Key
180+ -> EffFnAff (idb :: IDB | e) Key
181+
174
182
175foreign import _source
183foreign import _source
176 :: forall cursor
184 :: forall cursor
177− . Fn3 (ObjectStore -> CursorSource) (Index -> CursorSource) cursor CursorSource
185+ . Fn3 (ObjectStore -> CursorSource) (Index -> CursorSource) cursor CursorSource
186+
178
187
179foreign import _update
188foreign import _update
180− :: forall cursor
189+ :: forall cursor e
181− . Fn2 cursor Foreign (EffectFnAff Foreign)
190+ . Fn2 cursor Foreign (EffFnAff (idb :: IDB | e) Foreign)
191+
182
192
183foreign import _value
193foreign import _value
184 :: forall cursor val
194 :: forall cursor val
185− . cursor
195+ . cursor
186 -> val
196 -> val
src/Database/IndexedDB/IDBDatabase.js+11−11
@@ -3,7 +3,7 @@ const toArray = function toArray(xs) {
3};
3};
4
4
5
5
6−export function _close(db) {
6+exports._close = function _close(db) {
7 return function aff(error, success) {
7 return function aff(error, success) {
8 try {
8 try {
9 db.close();
9 db.close();
@@ -18,7 +18,7 @@ export function _close(db) {
18 };
18 };
19};
19};
20
20
21−export function _createObjectStore(db, name, opts) {
21+exports._createObjectStore = function _createObjectStore(db, name, opts) {
22 return function aff(error, success) {
22 return function aff(error, success) {
23 var keyPath;
23 var keyPath;
24
24
@@ -52,7 +52,7 @@ export function _createObjectStore(db, name, opts) {
52 };
52 };
53};
53};
54
54
55−export function _deleteObjectStore(db, name) {
55+exports._deleteObjectStore = function _deleteObjectStore(db, name) {
56 return function aff(error, success) {
56 return function aff(error, success) {
57 try {
57 try {
58 db.deleteObjectStore(name);
58 db.deleteObjectStore(name);
@@ -67,15 +67,15 @@ export function _deleteObjectStore(db, name) {
67 };
67 };
68};
68};
69
69
70−export function _name(db) {
70+exports._name = function _name(db) {
71 return db.name;
71 return db.name;
72};
72};
73
73
74−export function _objectStoreNames(db) {
74+exports._objectStoreNames = function _objectStoreNames(db) {
75 return toArray(db.objectStoreNames);
75 return toArray(db.objectStoreNames);
76};
76};
77
77
78−export function _onAbort(db, f) {
78+exports._onAbort = function _onAbort(db, f) {
79 return function aff(error, success) {
79 return function aff(error, success) {
80 db.onabort = function onabort() {
80 db.onabort = function onabort() {
81 f();
81 f();
@@ -88,7 +88,7 @@ export function _onAbort(db, f) {
88 };
88 };
89};
89};
90
90
91−export function _onClose(db, f) {
91+exports._onClose = function _onClose(db, f) {
92 return function aff(error, success) {
92 return function aff(error, success) {
93 db.onclose = function onclose() {
93 db.onclose = function onclose() {
94 f();
94 f();
@@ -101,7 +101,7 @@ export function _onClose(db, f) {
101 };
101 };
102};
102};
103
103
104−export function _onError(db, f) {
104+exports._onError = function _onError(db, f) {
105 return function aff(error, success) {
105 return function aff(error, success) {
106 db.onerror = function onerror(e) {
106 db.onerror = function onerror(e) {
107 f(e.target.error)();
107 f(e.target.error)();
@@ -114,7 +114,7 @@ export function _onError(db, f) {
114 };
114 };
115};
115};
116
116
117−export function _onVersionChange(db, f) {
117+exports._onVersionChange = function _onVersionChange(db, f) {
118 return function aff(error, success) {
118 return function aff(error, success) {
119 db.onversionchange = function onversionchange(e) {
119 db.onversionchange = function onversionchange(e) {
120 f({ oldVersion: e.oldVersion, newVersion: e.newVersion })();
120 f({ oldVersion: e.oldVersion, newVersion: e.newVersion })();
@@ -127,7 +127,7 @@ export function _onVersionChange(db, f) {
127 };
127 };
128};
128};
129
129
130−export function _transaction(db, stores, mode) {
130+exports._transaction = function _transaction(db, stores, mode) {
131 return function aff(error, success) {
131 return function aff(error, success) {
132 var transaction;
132 var transaction;
133 try {
133 try {
@@ -144,6 +144,6 @@ export function _transaction(db, stores, mode) {
144 };
144 };
145};
145};
146
146
147−export function _version(db) {
147+exports._version = function _version(db) {
148 return db.version;
148 return db.version;
149};
149};
src/Database/IndexedDB/IDBDatabase.purs+98−73
@@ -24,15 +24,17 @@ module Database.IndexedDB.IDBDatabase
24 , onVersionChange
24 , onVersionChange
25 ) where
25 ) where
26
26
27+import Prelude (Unit, show, (<<<), ($))
28+
29+import Control.Monad.Aff (Aff)
30+import Control.Monad.Aff.Compat (fromEffFnAff, EffFnAff)
31+import Control.Monad.Eff (Eff)
32+import Control.Monad.Eff.Exception (Error)
33+import Data.Function.Uncurried as Fn
34+import Data.Function.Uncurried (Fn2, Fn3)
35+
27import Database.IndexedDB.Core
36import Database.IndexedDB.Core
28
37
29−import Data.Function.Uncurried (Fn2, Fn3)
30−import Data.Function.Uncurried as Fn
31−import Effect (Effect)
32−import Effect.Aff (Aff)
33−import Effect.Aff.Compat (EffectFnAff, fromEffectFnAff)
34−import Effect.Exception (Error)
35−import Prelude (Unit, show, (<<<), ($))
36
38
37--------------------
39--------------------
38-- TYPES
40-- TYPES
@@ -41,67 +43,70 @@ import Prelude (Unit, show, (<<<), ($))
41-- | Type alias for StoreName
43-- | Type alias for StoreName
42type StoreName = String
44type StoreName = String
43
45
46+
44-- | Options provided when creating an object store.
47-- | Options provided when creating an object store.
45type ObjectStoreParameters =
48type ObjectStoreParameters =
46− { keyPath :: KeyPath
49+ { keyPath :: KeyPath
47 , autoIncrement :: Boolean
50 , autoIncrement :: Boolean
48 }
51 }
49
52
53+
50defaultParameters :: ObjectStoreParameters
54defaultParameters :: ObjectStoreParameters
51defaultParameters =
55defaultParameters =
52− { keyPath: []
56+ { keyPath : []
53− , autoIncrement: false
57+ , autoIncrement : false
54 }
58 }
55
59
60+
56--------------------
61--------------------
57-- INTERFACE
62-- INTERFACE
58--
63--
59
64
60-- | Closes the connection once all running transactions have finished.
65-- | Closes the connection once all running transactions have finished.
61close
66close
62− :: forall db
63− . (IDBDatabase db)
67+ :: forall e db. (IDBDatabase db)
64 => db
68 => db
65− -> Aff Unit
69+ -> Aff (idb :: IDB | e) Unit
66close =
70close =
67− fromEffectFnAff <<< _close
71+ fromEffFnAff <<< _close
72+
68
73
69-- | Creates a new object store with the given name and options and returns a new IDBObjectStore.
74-- | Creates a new object store with the given name and options and returns a new IDBObjectStore.
70-- |
75-- |
71-- | Throws a "InvalidStateError" DOMException if not called within an upgrade transaction
76-- | Throws a "InvalidStateError" DOMException if not called within an upgrade transaction
72createObjectStore
77createObjectStore
73− :: forall db
74− . (IDBDatabase db)
78+ :: forall e db. (IDBDatabase db)
75 => db
79 => db
76 -> StoreName
80 -> StoreName
77 -> ObjectStoreParameters
81 -> ObjectStoreParameters
78− -> Aff ObjectStore
82+ -> Aff (idb :: IDB | e) ObjectStore
79createObjectStore db name' opts =
83createObjectStore db name' opts =
80− fromEffectFnAff $ Fn.runFn3 _createObjectStore db name' opts
84+ fromEffFnAff $ Fn.runFn3 _createObjectStore db name' opts
85+
81
86
82-- | Deletes the object store with the given name.
87-- | Deletes the object store with the given name.
83-- |
88-- |
84-- | Throws a "InvalidStateError" DOMException if not called within an upgrade transaction.
89-- | Throws a "InvalidStateError" DOMException if not called within an upgrade transaction.
85deleteObjectStore
90deleteObjectStore
86− :: forall db
87− . (IDBDatabase db)
91+ :: forall e db. (IDBDatabase db)
88 => db
92 => db
89 -> StoreName
93 -> StoreName
90− -> Aff ObjectStore
94+ -> Aff (idb :: IDB | e) ObjectStore
91deleteObjectStore db name' =
95deleteObjectStore db name' =
92− fromEffectFnAff $ Fn.runFn2 _deleteObjectStore db name'
96+ fromEffFnAff $ Fn.runFn2 _deleteObjectStore db name'
97+
93
98
94-- | Returns a new transaction with the given mode (ReadOnly|ReadWrite)
99-- | Returns a new transaction with the given mode (ReadOnly|ReadWrite)
95-- | and scope which in the form of an array of object store names.
100-- | and scope which in the form of an array of object store names.
96transaction
101transaction
97− :: forall db
98− . (IDBDatabase db)
102+ :: forall e db. (IDBDatabase db)
99 => db
103 => db
100 -> Array StoreName
104 -> Array StoreName
101 -> TransactionMode
105 -> TransactionMode
102− -> Aff Transaction
106+ -> Aff (idb :: IDB | e) Transaction
103transaction db stores mode' =
107transaction db stores mode' =
104− fromEffectFnAff $ Fn.runFn3 _transaction db stores (show mode')
108+ fromEffFnAff $ Fn.runFn3 _transaction db stores (show mode')
109+
105
110
106--------------------
111--------------------
107-- ATTRIBUTES
112-- ATTRIBUTES
@@ -109,107 +114,127 @@ transaction db stores mode' =
109
114
110-- | Returns the name of the database.
115-- | Returns the name of the database.
111name
116name
112− :: Database
117+ :: Database
113− -> String
118+ -> String
114name =
119name =
115 _name
120 _name
116
121
122+
117-- | Returns a list of the names of object stores in the database.
123-- | Returns a list of the names of object stores in the database.
118objectStoreNames
124objectStoreNames
119− :: Database
125+ :: Database
120− -> Array String
126+ -> Array String
121objectStoreNames =
127objectStoreNames =
122 _objectStoreNames
128 _objectStoreNames
123
129
130+
124-- | Returns the version of the database.
131-- | Returns the version of the database.
125version
132version
126− :: Database
133+ :: Database
127− -> Int
134+ -> Int
128version =
135version =
129 _version
136 _version
130
137
138+
131--------------------
139--------------------
132-- EVENT HANDLERS
140-- EVENT HANDLERS
133--
141--
134-- | Event handler for the `abort` event.
142-- | Event handler for the `abort` event.
135onAbort
143onAbort
144+ :: forall e e'
136− :: Database
145+ . Database
137− -> Effect Unit
146+ -> Eff ( | e') Unit
138− -> Aff Unit
147+ -> Aff (idb :: IDB | e) Unit
139onAbort db f =
148onAbort db f =
140− fromEffectFnAff $ Fn.runFn2 _onAbort db f
149+ fromEffFnAff $ Fn.runFn2 _onAbort db f
150+
141
151
142-- | Event handler for the `close` event.
152-- | Event handler for the `close` event.
143onClose
153onClose
154+ :: forall e e'
144− :: Database
155+ . Database
145− -> Effect Unit
156+ -> Eff ( | e') Unit
146− -> Aff Unit
157+ -> Aff (idb :: IDB | e) Unit
147onClose db f =
158onClose db f =
148− fromEffectFnAff $ Fn.runFn2 _onClose db f
159+ fromEffFnAff $ Fn.runFn2 _onClose db f
160+
149
161
150-- | Event handler for the `error` event.
162-- | Event handler for the `error` event.
151onError
163onError
164+ :: forall e e'
152− :: Database
165+ . Database
153− -> (Error -> Effect Unit)
166+ -> (Error -> Eff ( | e') Unit)
154− -> Aff Unit
167+ -> Aff (idb :: IDB | e) Unit
155onError db f =
168onError db f =
156− fromEffectFnAff $ Fn.runFn2 _onError db f
169+ fromEffFnAff $ Fn.runFn2 _onError db f
170+
157
171
158-- | Event handler for the `versionchange` event.
172-- | Event handler for the `versionchange` event.
159onVersionChange
173onVersionChange
174+ :: forall e e'
160− :: Database
175+ . Database
161− -> ( { oldVersion :: Int, newVersion :: Int }
176+ -> ({ oldVersion :: Int, newVersion :: Int }
162− -> Effect Unit
177+ -> Eff ( | e') Unit)
163− )
164− -> Aff Unit
178+ -> Aff (idb :: IDB | e) Unit
165onVersionChange db f =
179onVersionChange db f =
166− fromEffectFnAff $ Fn.runFn2 _onVersionChange db f
180+ fromEffFnAff $ Fn.runFn2 _onVersionChange db f
181+
167
182
168--------------------
183--------------------
169-- FFI
184-- FFI
170--
185--
171
186
172foreign import _close
187foreign import _close
173− :: forall db
188+ :: forall db e
174− . db
189+ . db
175− -> EffectFnAff Unit
190+ -> EffFnAff (idb :: IDB | e) Unit
191+
176
192
177foreign import _createObjectStore
193foreign import _createObjectStore
178− :: forall db
194+ :: forall db e
179− . Fn3 db String { keyPath :: Array String, autoIncrement :: Boolean } (EffectFnAff ObjectStore)
195+ . Fn3 db String { keyPath :: Array String, autoIncrement :: Boolean } (EffFnAff (idb :: IDB | e) ObjectStore)
196+
180
197
181foreign import _deleteObjectStore
198foreign import _deleteObjectStore
182− :: forall db
199+ :: forall db e
183− . Fn2 db String (EffectFnAff ObjectStore)
200+ . Fn2 db String (EffFnAff (idb :: IDB | e) ObjectStore)
201+
184
202
185foreign import _name
203foreign import _name
186− :: Database
204+ :: Database
187− -> String
205+ -> String
206+
188
207
189foreign import _objectStoreNames
208foreign import _objectStoreNames
190− :: Database
209+ :: Database
191− -> Array String
210+ -> Array String
211+
192
212
193foreign import _onAbort
213foreign import _onAbort
194− :: forall db
214+ :: forall db e e'
195− . Fn2 db (Effect Unit) (EffectFnAff Unit)
215+ . Fn2 db (Eff ( | e') Unit) (EffFnAff (idb :: IDB | e) Unit)
216+
196
217
197foreign import _onClose
218foreign import _onClose
198− :: forall db
219+ :: forall db e e'
199− . Fn2 db (Effect Unit) (EffectFnAff Unit)
220+ . Fn2 db (Eff ( | e') Unit) (EffFnAff (idb :: IDB | e) Unit)
221+
200
222
201foreign import _onError
223foreign import _onError
202− :: forall db
224+ :: forall db e e'
203− . Fn2 db (Error -> Effect Unit) (EffectFnAff Unit)
225+ . Fn2 db (Error -> Eff ( | e') Unit) (EffFnAff (idb :: IDB | e) Unit)
226+
204
227
205foreign import _onVersionChange
228foreign import _onVersionChange
206− :: forall db
229+ :: forall db e e'
207− . Fn2 db ({ oldVersion :: Int, newVersion :: Int } -> Effect Unit) (EffectFnAff Unit)
230+ . Fn2 db ({ oldVersion :: Int, newVersion :: Int } -> Eff ( | e') Unit) (EffFnAff (idb :: IDB | e) Unit)
231+
208
232
209foreign import _transaction
233foreign import _transaction
210− :: forall db
234+ :: forall db e
211− . Fn3 db (Array String) String (EffectFnAff Transaction)
235+ . Fn3 db (Array String) String (EffFnAff (idb :: IDB | e) Transaction)
236+
212
237
213foreign import _version
238foreign import _version
214− :: Database
239+ :: Database
215− -> Int
240+ -> Int
src/Database/IndexedDB/IDBFactory.js+2−2
@@ -18,7 +18,7 @@ const noOp3 = function noOp3() {
18 return noOp2;
18 return noOp2;
19};
19};
20
20
21−export function _deleteDatabase(name) {
21+exports._deleteDatabase = function _deleteDatabase(name) {
22 return function aff(error, success) {
22 return function aff(error, success) {
23 try {
23 try {
24 const request = indexedDB.deleteDatabase(name);
24 const request = indexedDB.deleteDatabase(name);
@@ -38,7 +38,7 @@ export function _deleteDatabase(name) {
38 };
38 };
39};
39};
40
40
41−export function _open(fromMaybe, name, mver, req) {
41+exports._open = function _open(fromMaybe, name, mver, req) {
42 const ver = fromMaybe(undefined)(mver);
42 const ver = fromMaybe(undefined)(mver);
43
43
44 return function aff(error, success) {
44 return function aff(error, success) {
src/Database/IndexedDB/IDBFactory.purs+33−22
@@ -12,32 +12,37 @@ module Database.IndexedDB.IDBFactory
12 , open
12 , open
13 ) where
13 ) where
14
14
15+import Prelude (Unit, ($), (<<<))
16+
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)
23+
15import Database.IndexedDB.Core
24import Database.IndexedDB.Core
16
25
17−import Data.Function.Uncurried (Fn4)
18−import Data.Function.Uncurried as Fn
19−import Data.Maybe (Maybe, fromMaybe)
20−import Effect (Effect)
21−import Effect.Aff (Aff)
22−import Effect.Aff.Compat (EffectFnAff, fromEffectFnAff)
23−import Prelude (Unit, ($), (<<<))
24
26
25--------------------
27--------------------
26-- TYPES
28-- TYPES
27--
29--
28
30
29-- Type alias for binding listeners to an initial open action.
31-- Type alias for binding listeners to an initial open action.
30−type Callbacks =
32+type Callbacks e =
31− { onBlocked :: Maybe (Effect Unit)
33+ { onBlocked :: Maybe (Eff (| e) Unit)
32− , onUpgradeNeeded :: Maybe (Database -> Transaction -> { oldVersion :: Int } -> Effect Unit)
34+ , onUpgradeNeeded :: Maybe (Database -> Transaction -> { oldVersion :: Int } -> Eff (| e) Unit)
33 }
35 }
34
36
37+
35-- | Type alias for DatabaseName.
38-- | Type alias for DatabaseName.
36type DatabaseName = String
39type DatabaseName = String
37
40
41+
38-- | Type alias for Version.
42-- | Type alias for Version.
39type Version = Int
43type Version = Int
40
44
45+
41--------------------
46--------------------
42-- INTERFACE
47-- INTERFACE
43--
48--
@@ -46,10 +51,12 @@ type Version = Int
46-- | and there are open connections that don’t close in response to a
51-- | and there are open connections that don’t close in response to a
47-- | `versionchange` event, the request will be blocked until all they close.
52-- | `versionchange` event, the request will be blocked until all they close.
48deleteDatabase
53deleteDatabase
54+ :: forall e
49− :: DatabaseName
55+ . DatabaseName
50− -> Aff Int
56+ -> Aff (idb :: IDB | e) Int
51deleteDatabase =
57deleteDatabase =
52− fromEffectFnAff <<< _deleteDatabase
58+ fromEffFnAff <<< _deleteDatabase
59+
53
60
54-- | Attempts to open a connection to the named database with the specified version.
61-- | Attempts to open a connection to the named database with the specified version.
55-- | If the database already exists with a lower version and there are open connections
62-- | If the database already exists with a lower version and there are open connections
@@ -60,20 +67,24 @@ deleteDatabase =
60-- | When the version isn't provided (`Nothing`), attempts to open a connection to the
67-- | When the version isn't provided (`Nothing`), attempts to open a connection to the
61-- | named database with the current version, or 1 if it does not already exist.
68-- | named database with the current version, or 1 if it does not already exist.
62open
69open
70+ :: forall e e'
63− :: DatabaseName
71+ . DatabaseName
64− -> Maybe Version
72+ -> Maybe Version
65− -> Callbacks
73+ -> Callbacks e'
66− -> Aff Database
74+ -> Aff (idb :: IDB | e) Database
67open name mver req =
75open name mver req =
68− fromEffectFnAff $ Fn.runFn4 _open fromMaybe name mver req
76+ fromEffFnAff $ Fn.runFn4 _open fromMaybe name mver req
77+
69
78
70--------------------
79--------------------
71-- FFI
80-- FFI
72--
81--
73foreign import _deleteDatabase
82foreign import _deleteDatabase
83+ :: forall e
74− :: String
84+ . String
75− -> EffectFnAff Int
85+ -> EffFnAff (idb :: IDB | e) Int
86+
76
87
77foreign import _open
88foreign import _open
78− :: forall a
89+ :: forall a e e'
79− . Fn4 (a -> Maybe a -> a) String (Maybe Int) (Callbacks) (EffectFnAff Database)
90+ . Fn4 (a -> Maybe a -> a) String (Maybe Int) (Callbacks e') (EffFnAff (idb :: IDB | e) Database)
src/Database/IndexedDB/IDBIndex.js+12−12
@@ -11,7 +11,7 @@ const successHandler = function successHandler(cb) {
11};
11};
12
12
13
13
14−export function _keyPath(index) {
14+exports._keyPath = function _keyPath(index) {
15 const path = index.keyPath;
15 const path = index.keyPath;
16
16
17 if (Array.isArray(path)) {
17 if (Array.isArray(path)) {
@@ -25,23 +25,23 @@ export function _keyPath(index) {
25 return [];
25 return [];
26};
26};
27
27
28−export function _multiEntry(index) {
28+exports._multiEntry = function _multiEntry(index) {
29 return index.multiEntry;
29 return index.multiEntry;
30};
30};
31
31
32−export function _name(index) {
32+exports._name = function _name(index) {
33 return index.name;
33 return index.name;
34};
34};
35
35
36−export function _objectStore(index) {
36+exports._objectStore = function _objectStore(index) {
37 return index.obectStore;
37 return index.obectStore;
38};
38};
39
39
40−export function _unique(index) {
40+exports._unique = function _unique(index) {
41 return index.unique;
41 return index.unique;
42};
42};
43
43
44−export function _count(index, query) {
44+exports._count = function _count(index, query) {
45 return function aff(error, success) {
45 return function aff(error, success) {
46 try {
46 try {
47 const request = index.count(query);
47 const request = index.count(query);
@@ -57,7 +57,7 @@ export function _count(index, query) {
57 };
57 };
58};
58};
59
59
60−export function _get(index, range) {
60+exports._get = function _get(index, range) {
61 return function aff(error, success) {
61 return function aff(error, success) {
62 try {
62 try {
63 const request = index.get(range);
63 const request = index.get(range);
@@ -79,7 +79,7 @@ export function _get(index, range) {
79 *
79 *
80 * However, it may be doable to convert the result to some key / value structure with values of
80 * However, it may be doable to convert the result to some key / value structure with values of
81 * different types.
81 * different types.
82−export function _getAll(index, query, count) {
82+exports._getAll = function _getAll(index, query, count) {
83 return function aff(error, success) {
83 return function aff(error, success) {
84 const request = index.getAll(query, count);
84 const request = index.getAll(query, count);
85 request.onsuccess = successHandler(success);
85 request.onsuccess = successHandler(success);
@@ -88,7 +88,7 @@ export function _getAll(index, query, count) {
88};
88};
89*/
89*/
90
90
91−export function _getAllKeys(index, range, count) {
91+exports._getAllKeys = function _getAllKeys(index, range, count) {
92 return function aff(error, success) {
92 return function aff(error, success) {
93 try {
93 try {
94 const request = index.getAllKeys(range, count || undefined);
94 const request = index.getAllKeys(range, count || undefined);
@@ -104,7 +104,7 @@ export function _getAllKeys(index, range, count) {
104 };
104 };
105};
105};
106
106
107−export function _getKey(index, range) {
107+exports._getKey = function _getKey(index, range) {
108 return function aff(error, success) {
108 return function aff(error, success) {
109 try {
109 try {
110 const request = index.getKey(range);
110 const request = index.getKey(range);
@@ -120,7 +120,7 @@ export function _getKey(index, range) {
120 };
120 };
121};
121};
122
122
123−export function _openCursor(index, query, dir, cb) {
123+exports._openCursor = function _openCursor(index, query, dir, cb) {
124 return function aff(error, success) {
124 return function aff(error, success) {
125 try {
125 try {
126 const request = index.openCursor(query, dir);
126 const request = index.openCursor(query, dir);
@@ -145,7 +145,7 @@ export function _openCursor(index, query, dir, cb) {
145 };
145 };
146};
146};
147
147
148−export function _openKeyCursor(index, query, dir, cb) {
148+exports._openKeyCursor = function _openKeyCursor(index, query, dir, cb) {
149 return function aff(error, success) {
149 return function aff(error, success) {
150 try {
150 try {
151 const request = index.openKeyCursor(query, dir);
151 const request = index.openKeyCursor(query, dir);
src/Database/IndexedDB/IDBIndex.purs+96−78
@@ -20,187 +20,205 @@ module Database.IndexedDB.IDBIndex
20 , unique
20 , unique
21 ) where
21 ) where
22
22
23−import Database.IndexedDB.Core
23+import Prelude (Unit, map, show, (<$>), (>>>), ($))
24+
25+import Control.Monad.Aff (Aff)
26+import Control.Monad.Aff.Compat (EffFnAff, fromEffFnAff)
27+import Control.Monad.Eff (Eff)
28+import Control.Monad.Eff.Exception (Error)
29+import Data.Foreign (Foreign, unsafeFromForeign)
30+import Data.Function.Uncurried as Fn
31+import Data.Function.Uncurried (Fn2, Fn3, Fn4)
32+import Data.Maybe (Maybe)
33+import Data.Nullable (Nullable, toMaybe, toNullable)
24
34
25−import Data.Function.Uncurried (Fn2, Fn3, Fn4)
35+import Database.IndexedDB.Core
26−import Data.Function.Uncurried as Fn
27−import Data.Maybe (Maybe)
28−import Data.Nullable (Nullable, toMaybe, toNullable)
29import Database.IndexedDB.IDBKey.Internal (Key, toKey)
36import Database.IndexedDB.IDBKey.Internal (Key, toKey)
30−import Effect (Effect)
37+
31−import Effect.Aff (Aff)
32−import Effect.Aff.Compat (EffectFnAff, fromEffectFnAff)
33−import Effect.Exception (Error)
34−import Foreign (Foreign, unsafeFromForeign)
35−import Prelude (Unit, map, show, ($), (>>>))
36
38
37--------------------
39--------------------
38-- TYPES
40-- TYPES
39--
41--
40
42
41-- | Callbacks to manipulate a cursor from an Open*Cursor call
43-- | Callbacks to manipulate a cursor from an Open*Cursor call
42−type Callbacks cursor =
44+type Callbacks cursor e =
43− { onSuccess :: cursor -> Effect Unit
45+ { onSuccess :: cursor -> Eff ( | e) Unit
44− , onError :: Error -> Effect Unit
46+ , onError :: Error -> Eff ( | e) Unit
45− , onComplete :: Effect Unit
47+ , onComplete :: Eff ( | e) Unit
46 }
48 }
47
49
50+
48--------------------
51--------------------
49-- INTERFACES
52-- INTERFACES
50--
53--
51
54
52-- | Retrieves the number of records matching the key range in query.
55-- | Retrieves the number of records matching the key range in query.
53count
56count
54− :: forall index
55− . (IDBIndex index)
57+ :: forall e index. (IDBIndex index)
56− => index
58+ => index
57 -> Maybe KeyRange
59 -> Maybe KeyRange
58− -> Aff Int
60+ -> Aff (idb :: IDB | e) Int
59count index range =
61count index range =
60− fromEffectFnAff $ Fn.runFn2 _count index (toNullable range)
62+ fromEffFnAff $ Fn.runFn2 _count index (toNullable range)
63+
61
64
62-- | Retrieves the value of the first record matching the given key range in query.
65-- | Retrieves the value of the first record matching the given key range in query.
63-- |
66-- |
64-- | NOTE
67-- | NOTE
65-- | The coercion from `a` to any type is unsafe and might throw a runtime error if incorrect.
68-- | The coercion from `a` to any type is unsafe and might throw a runtime error if incorrect.
66get
69get
67− :: forall a index
68− . (IDBIndex index)
70+ :: forall a e index. (IDBIndex index)
69 => index
71 => index
70 -> KeyRange
72 -> KeyRange
71− -> Aff (Maybe a)
73+ -> Aff (idb :: IDB | e) (Maybe a)
72get index range =
74get index range =
73− map (toMaybe >>> map unsafeFromForeign) $ fromEffectFnAff $ Fn.runFn2 _get index range
75+ map (toMaybe >>> map unsafeFromForeign) $ fromEffFnAff $ Fn.runFn2 _get index range
76+
74
77
75-- | Retrieves the keys of records matching the given key range in query
78-- | Retrieves the keys of records matching the given key range in query
76-- | (up to the number given if given).
79-- | (up to the number given if given).
77getAllKeys
80getAllKeys
78− :: forall index
79− . (IDBIndex index)
81+ :: forall e index. (IDBIndex index)
80 => index
82 => index
81 -> Maybe KeyRange
83 -> Maybe KeyRange
82 -> Maybe Int
84 -> Maybe Int
83− -> Aff (Array Key)
85+ -> Aff (idb :: IDB | e) (Array Key)
84getAllKeys index range n =
86getAllKeys index range n =
85− map (map toKey) $ fromEffectFnAff $ Fn.runFn3 _getAllKeys index (toNullable range) (toNullable n)
87+ map (map toKey) $ fromEffFnAff $ Fn.runFn3 _getAllKeys index (toNullable range) (toNullable n)
88+
86
89
87-- | Retrieves the key of the first record matching the given key or key range in query.
90-- | Retrieves the key of the first record matching the given key or key range in query.
88getKey
91getKey
89− :: forall index
90− . (IDBIndex index)
92+ :: forall e index. (IDBIndex index)
91 => index
93 => index
92 -> KeyRange
94 -> KeyRange
93− -> Aff (Maybe Key)
95+ -> Aff (idb :: IDB | e) (Maybe Key)
94getKey index range =
96getKey index range =
95− map (toMaybe >>> map toKey) $ fromEffectFnAff $ Fn.runFn2 _getKey index range
97+ map (toMaybe >>> map toKey) $ fromEffFnAff $ Fn.runFn2 _getKey index range
98+
96
99
97-- | Opens a ValueCursor over the records matching query, ordered by direction.
100-- | Opens a ValueCursor over the records matching query, ordered by direction.
98-- | If query is `Nothing`, all records in index are matched.
101-- | If query is `Nothing`, all records in index are matched.
99openCursor
102openCursor
100− :: forall index
101− . (IDBIndex index)
103+ :: forall e e' index. (IDBIndex index)
102− => index
104+ => index
103 -> Maybe KeyRange
105 -> Maybe KeyRange
104 -> CursorDirection
106 -> CursorDirection
105− -> Callbacks ValueCursor
107+ -> Callbacks ValueCursor e'
106− -> Aff Unit
108+ -> Aff (idb :: IDB | e) Unit
107openCursor index range dir cb =
109openCursor index range dir cb =
108− fromEffectFnAff $ Fn.runFn4 _openCursor index (toNullable range) (show dir) cb
110+ fromEffFnAff $ Fn.runFn4 _openCursor index (toNullable range) (show dir) cb
111+
109
112
110-- | Opens a KeyCursor over the records matching query, ordered by direction.
113-- | Opens a KeyCursor over the records matching query, ordered by direction.
111-- | If query is `Nothing`, all records in index are matched.
114-- | If query is `Nothing`, all records in index are matched.
112openKeyCursor
115openKeyCursor
113− :: forall index
114− . (IDBIndex index)
116+ :: forall e e' index. (IDBIndex index)
115− => index
117+ => index
116− -> Maybe KeyRange
118+ -> Maybe KeyRange
117− -> CursorDirection
119+ -> CursorDirection
118− -> Callbacks KeyCursor
120+ -> Callbacks KeyCursor e'
119− -> Aff Unit
121+ -> Aff (idb :: IDB | e) Unit
120openKeyCursor index range dir cb =
122openKeyCursor index range dir cb =
121− fromEffectFnAff $ Fn.runFn4 _openKeyCursor index (toNullable range) (show dir) cb
123+ fromEffFnAff $ Fn.runFn4 _openKeyCursor index (toNullable range) (show dir) cb
124+
122
125
123--------------------
126--------------------
124-- ATTRIBUTES
127-- ATTRIBUTES
125--
128--
126-- | Returns the key path of the index.
129-- | Returns the key path of the index.
127keyPath
130keyPath
128− :: Index
131+ :: Index
129− -> KeyPath
132+ -> KeyPath
130keyPath =
133keyPath =
131 _keyPath
134 _keyPath
132
135
136+
133-- | Returns true if the index's multiEntry flag is set.
137-- | Returns true if the index's multiEntry flag is set.
134multiEntry
138multiEntry
135− :: Index
139+ :: Index
136− -> Boolean
140+ -> Boolean
137multiEntry =
141multiEntry =
138 _multiEntry
142 _multiEntry
139
143
144+
140-- | Returns the name of the index.
145-- | Returns the name of the index.
141name
146name
142− :: Index
147+ :: Index
143− -> String
148+ -> String
144name =
149name =
145 _name
150 _name
146
151
152+
147-- | Returns the IDBObjectStore the index belongs to.
153-- | Returns the IDBObjectStore the index belongs to.
148objectStore
154objectStore
149− :: Index
155+ :: Index
150− -> ObjectStore
156+ -> ObjectStore
151objectStore =
157objectStore =
152 _objectStore
158 _objectStore
153
159
160+
154-- | Returns true if the index's unique flag is set.
161-- | Returns true if the index's unique flag is set.
155unique
162unique
156− :: Index
163+ :: Index
157− -> Boolean
164+ -> Boolean
158unique =
165unique =
159 _unique
166 _unique
160
167
168+
161--------------------
169--------------------
162-- FFI
170-- FFI
163--
171--
164foreign import _keyPath
172foreign import _keyPath
165− :: Index
173+ :: Index
166− -> Array String
174+ -> Array String
175+
167
176
168foreign import _multiEntry
177foreign import _multiEntry
169− :: Index
178+ :: Index
170− -> Boolean
179+ -> Boolean
180+
171
181
172foreign import _name
182foreign import _name
173− :: Index
183+ :: Index
174− -> String
184+ -> String
185+
175
186
176foreign import _objectStore
187foreign import _objectStore
177− :: Index
188+ :: Index
178− -> ObjectStore
189+ -> ObjectStore
190+
179
191
180foreign import _unique
192foreign import _unique
181− :: Index
193+ :: Index
182− -> Boolean
194+ -> Boolean
195+
183
196
184foreign import _count
197foreign import _count
185− :: forall index
198+ :: forall index e
186− . Fn2 index (Nullable KeyRange) (EffectFnAff Int)
199+ . Fn2 index (Nullable KeyRange) (EffFnAff (idb :: IDB | e) Int)
200+
187
201
188foreign import _get
202foreign import _get
189− :: forall index
203+ :: forall index e
190− . Fn2 index KeyRange (EffectFnAff (Nullable Foreign))
204+ . Fn2 index KeyRange (EffFnAff (idb :: IDB | e) (Nullable Foreign))
205+
191
206
192foreign import _getAllKeys
207foreign import _getAllKeys
193− :: forall index
208+ :: forall index e
194− . Fn3 index (Nullable KeyRange) (Nullable Int) (EffectFnAff (Array Foreign))
209+ . Fn3 index (Nullable KeyRange) (Nullable Int) (EffFnAff (idb :: IDB | e) (Array Foreign))
210+
195
211
196foreign import _getKey
212foreign import _getKey
197− :: forall index
213+ :: forall index e
198− . Fn2 index KeyRange (EffectFnAff (Nullable Foreign))
214+ . Fn2 index KeyRange (EffFnAff (idb :: IDB | e) (Nullable Foreign))
215+
199
216
200foreign import _openCursor
217foreign import _openCursor
201− :: forall index
218+ :: forall index e e'
202− . Fn4 index (Nullable KeyRange) String (Callbacks ValueCursor) (EffectFnAff Unit)
219+ . Fn4 index (Nullable KeyRange) String (Callbacks ValueCursor e') (EffFnAff (idb :: IDB | e) Unit)
220+
203
221
204foreign import _openKeyCursor
222foreign import _openKeyCursor
205− :: forall index
223+ :: forall index e e'
206− . Fn4 index (Nullable KeyRange) String (Callbacks KeyCursor) (EffectFnAff Unit)
224+ . Fn4 index (Nullable KeyRange) String (Callbacks KeyCursor e') (EffFnAff (idb :: IDB | e) Unit)
src/Database/IndexedDB/IDBKey/Internal.js+3−3
@@ -1,8 +1,8 @@
1−export function _dateTimeToForeign(y, m, d, h, mi, s, ms) {
1+exports._dateTimeToForeign = function _dateTimeToForeign(y, m, d, h, mi, s, ms) {
2 return new Date(y, m, d, h, mi, s, ms);
2 return new Date(y, m, d, h, mi, s, ms);
3};
3};
4
4
5−export function _readDateTime(parse, right, left, date) {
5+exports._readDateTime = function _readDateTime(parse, right, left, date) {
6 if (Object.getPrototypeOf(date) !== Date.prototype) {
6 if (Object.getPrototypeOf(date) !== Date.prototype) {
7 return left(typeof date);
7 return left(typeof date);
8 }
8 }
@@ -24,7 +24,7 @@ export function _readDateTime(parse, right, left, date) {
24 return right(mdate);
24 return right(mdate);
25};
25};
26
26
27−export function _unsafeReadDateTime(parse, date) {
27+exports._unsafeReadDateTime = function _unsafeReadDateTime(parse, date) {
28 const y = date.getFullYear();
28 const y = date.getFullYear();
29 const m = date.getMonth() + 1;
29 const m = date.getMonth() + 1;
30 const d = date.getDate();
30 const d = date.getDate();
src/Database/IndexedDB/IDBKey/Internal.purs+106−90
@@ -3,36 +3,35 @@
3-- | NOTE: Binary keys aren't supported yet.
3-- | NOTE: Binary keys aren't supported yet.
4module Database.IndexedDB.IDBKey.Internal
4module Database.IndexedDB.IDBKey.Internal
5 ( Key
5 ( Key
6− , class IDBKey
7− , toKey
8− , fromKey
9− , unsafeFromKey
6+ , class IDBKey, toKey , fromKey , unsafeFromKey
10 , none
7 , none
11 ) where
8 ) where
12
9
13import Prelude
10import Prelude
14
11
15−import Control.Alt ((<|>))
12+import Control.Alt ((<|>))
16−import Control.Monad.Except (ExceptT(..), runExceptT)
13+import Control.Monad.Except (ExceptT(..), runExceptT)
17−import Data.Date as Date
14+import Data.Date as Date
18−import Data.DateTime (DateTime(..), Time(..))
15+import Data.DateTime (DateTime(..), Time(..))
19−import Data.Either (Either(..), either, isRight)
16+import Data.Either (Either(..), either, isRight)
20−import Data.Enum (fromEnum, toEnum)
17+import Data.Enum (fromEnum, toEnum)
21−import Foreign as Foreign
18+import Data.Foreign as Foreign
22−import Foreign (Foreign, F)
19+import Data.Foreign (Foreign, F)
23−import Data.Function.Uncurried as Fn
20+import Data.Function.Uncurried as Fn
24import Data.Function.Uncurried (Fn2, Fn4, Fn7)
21import Data.Function.Uncurried (Fn2, Fn4, Fn7)
25−import Data.Identity (Identity(..))
22+import Data.Identity (Identity(..))
26−import Data.List.NonEmpty (NonEmptyList(..))
23+import Data.List.NonEmpty (NonEmptyList(..))
27−import Data.List.Types (List(..))
24+import Data.List.Types (List(..))
28−import Data.Maybe (Maybe(..))
25+import Data.Maybe (Maybe(..))
29−import Data.NonEmpty (NonEmpty(..))
26+import Data.NonEmpty (NonEmpty(..))
30−import Data.Nullable (Nullable, toNullable)
27+import Data.Nullable (Nullable, toNullable)
31−import Data.Time as Time
28+import Data.Time as Time
32−import Data.Traversable (traverse)
29+import Data.Traversable (traverse)
30+
33
31
34newtype Key = Key Foreign
32newtype Key = Key Foreign
35
33
34+
36--------------------
35--------------------
37-- INTERFACES
36-- INTERFACES
38--
37--
@@ -40,90 +39,100 @@ newtype Key = Key Foreign
40-- | to a known type (e.g if you only strings as keys, or perfectly knows the
39-- | to a known type (e.g if you only strings as keys, or perfectly knows the
41-- | type of a given key).
40-- | type of a given key).
42class IDBKey a where
41class IDBKey a where
43− toKey :: a -> Key
42+ toKey :: a -> Key
44− fromKey :: Key -> F a
43+ fromKey :: Key -> F a
45 unsafeFromKey :: Key -> a
44 unsafeFromKey :: Key -> a
46
45
46+
47none :: Maybe Key
47none :: Maybe Key
48none =
48none =
49 Nothing
49 Nothing
50
50
51+
51--------------------
52--------------------
52-- INSTANCES
53-- INSTANCES
53--
54--
54instance eqKey :: Eq Key where
55instance eqKey :: Eq Key where
55 eq a b = (runExceptT >>> runIdentity >>> isRight) $
56 eq a b = (runExceptT >>> runIdentity >>> isRight) $
56− eq <$> ((fromKey a) :: F Int) <*> fromKey b
57+ eq <$> ((fromKey a) :: F Int) <*> fromKey b
57− <|>
58+ <|>
58− eq <$> ((fromKey a) :: F Number) <*> fromKey b
59+ eq <$> ((fromKey a) :: F Number) <*> fromKey b
59− <|>
60+ <|>
60− eq <$> ((fromKey a) :: F String) <*> fromKey b
61+ eq <$> ((fromKey a) :: F String) <*> fromKey b
61− <|>
62+ <|>
62− eq <$> ((fromKey a) :: F DateTime) <*> fromKey b
63+ eq <$> ((fromKey a) :: F DateTime) <*> fromKey b
63− <|>
64+ <|>
64− eq <$> ((fromKey a) :: F (Array Key)) <*> fromKey b
65+ eq <$> ((fromKey a) :: F (Array Key)) <*> fromKey b
65 where
66 where
66− runIdentity :: forall a. Identity a -> a
67+ runIdentity :: forall a. Identity a -> a
67− runIdentity (Identity x) = x
68+ runIdentity (Identity x) = x
69+
68
70
69instance ordKey :: Ord Key where
71instance ordKey :: Ord Key where
70− compare a b = (runExceptT >>> runIdentity >>> either (const LT) identity) $
72+ compare a b = (runExceptT >>> runIdentity >>> either (const LT) id) $
71− compare <$> ((fromKey a) :: F Int) <*> fromKey b
73+ compare <$> ((fromKey a) :: F Int) <*> fromKey b
72− <|>
74+ <|>
73− compare <$> ((fromKey a) :: F Number) <*> fromKey b
75+ compare <$> ((fromKey a) :: F Number) <*> fromKey b
74− <|>
76+ <|>
75− compare <$> ((fromKey a) :: F String) <*> fromKey b
77+ compare <$> ((fromKey a) :: F String) <*> fromKey b
76− <|>
78+ <|>
77− compare <$> ((fromKey a) :: F DateTime) <*> fromKey b
79+ compare <$> ((fromKey a) :: F DateTime) <*> fromKey b
78− <|>
80+ <|>
79− compare <$> ((fromKey a) :: F (Array Key)) <*> fromKey b
81+ compare <$> ((fromKey a) :: F (Array Key)) <*> fromKey b
80 where
82 where
81− runIdentity :: forall a. Identity a -> a
83+ runIdentity :: forall a. Identity a -> a
82− runIdentity (Identity x) = x
84+ runIdentity (Identity x) = x
85+
83
86
84instance showKey :: Show Key where
87instance showKey :: Show Key where
85 show a = (runExceptT >>> format) $
88 show a = (runExceptT >>> format) $
86− (show <$> (fromKey a :: F Int))
89+ (show <$> (fromKey a :: F Int))
87− <|>
90+ <|>
88− (show <$> (fromKey a :: F Number))
91+ (show <$> (fromKey a :: F Number))
89− <|>
92+ <|>
90− (show <$> (fromKey a :: F String))
93+ (show <$> (fromKey a :: F String))
91− <|>
94+ <|>
92− (show <$> (fromKey a :: F DateTime))
95+ (show <$> (fromKey a :: F DateTime))
93− <|>
96+ <|>
94− (show <$> (fromKey a :: F (Array Key)))
97+ (show <$> (fromKey a :: F (Array Key)))
95 where
98 where
96− format :: forall a. Identity (Either a String) -> String
99+ format :: forall a. Identity (Either a String) -> String
97− format (Identity x) =
100+ format (Identity x) =
98− either (const "(Key)") (\s -> "(Key " <> s <> ")") x
101+ either (const "(Key)") (\s -> "(Key " <> s <> ")") x
102+
99
103
100instance idbKeyKey :: IDBKey Key where
104instance idbKeyKey :: IDBKey Key where
101− toKey = identity
105+ toKey = id
102− fromKey = pure
106+ fromKey = pure
103− unsafeFromKey = identity
107+ unsafeFromKey = id
108+
104
109
105instance idbKeyForeign :: IDBKey Foreign where
110instance idbKeyForeign :: IDBKey Foreign where
106− toKey = Key
111+ toKey = Key
107− fromKey (Key f) = pure f
112+ fromKey (Key f) = pure f
108 unsafeFromKey (Key f) = f
113 unsafeFromKey (Key f) = f
109
114
115+
110instance idbKeyInt :: IDBKey Int where
116instance idbKeyInt :: IDBKey Int where
111− toKey = Foreign.unsafeToForeign >>> Key
117+ toKey = Foreign.toForeign >>> Key
112− fromKey (Key f) = Foreign.readInt f
118+ fromKey (Key f) = Foreign.readInt f
113 unsafeFromKey (Key f) = Foreign.unsafeFromForeign f
119 unsafeFromKey (Key f) = Foreign.unsafeFromForeign f
114
120
121+
115instance idbKeyNumber :: IDBKey Number where
122instance idbKeyNumber :: IDBKey Number where
116− toKey = Foreign.unsafeToForeign >>> Key
123+ toKey = Foreign.toForeign >>> Key
117− fromKey (Key f) = Foreign.readNumber f
124+ fromKey (Key f) = Foreign.readNumber f
118 unsafeFromKey (Key f) = Foreign.unsafeFromForeign f
125 unsafeFromKey (Key f) = Foreign.unsafeFromForeign f
119
126
127+
120instance idbKeyString :: IDBKey String where
128instance idbKeyString :: IDBKey String where
121− toKey = Foreign.unsafeToForeign >>> Key
129+ toKey = Foreign.toForeign >>> Key
122− fromKey (Key f) = Foreign.readString f
130+ fromKey (Key f) = Foreign.readString f
123 unsafeFromKey (Key f) = Foreign.unsafeFromForeign f
131 unsafeFromKey (Key f) = Foreign.unsafeFromForeign f
124
132
133+
125instance idbKeyDate :: IDBKey DateTime where
134instance idbKeyDate :: IDBKey DateTime where
126− toKey (DateTime d t) = Key $ Fn.runFn7 _dateTimeToForeign
135+ toKey (DateTime d t) = Key $ Fn.runFn7 _dateTimeToForeign
127 (fromEnum $ Date.year d)
136 (fromEnum $ Date.year d)
128 (fromEnum $ Date.month d)
137 (fromEnum $ Date.month d)
129 (fromEnum $ Date.day d)
138 (fromEnum $ Date.day d)
@@ -131,51 +140,58 @@ instance idbKeyDate :: IDBKey DateTime where
131 (fromEnum $ Time.minute t)
140 (fromEnum $ Time.minute t)
132 (fromEnum $ Time.second t)
141 (fromEnum $ Time.second t)
133 (fromEnum $ Time.millisecond t)
142 (fromEnum $ Time.millisecond t)
134− fromKey (Key f) = Fn.runFn4 _readDateTime dateTime dateTimeF dateTimeE f
143+ fromKey (Key f) = Fn.runFn4 _readDateTime dateTime dateTimeF dateTimeE f
135 unsafeFromKey (Key f) = Fn.runFn2 _unsafeReadDateTime dateTime f
144 unsafeFromKey (Key f) = Fn.runFn2 _unsafeReadDateTime dateTime f
136
145
146+
137instance idbKeyArray :: IDBKey a => IDBKey (Array a) where
147instance idbKeyArray :: IDBKey a => IDBKey (Array a) where
138− toKey = Foreign.unsafeToForeign >>> Key
148+ toKey = Foreign.toForeign >>> Key
139− fromKey (Key f) = Foreign.readArray f >>= traverse (Key >>> fromKey)
149+ fromKey (Key f) = Foreign.readArray f >>= traverse (Key >>> fromKey)
140 unsafeFromKey (Key f) = map unsafeFromKey (Foreign.unsafeFromForeign f)
150 unsafeFromKey (Key f) = map unsafeFromKey (Foreign.unsafeFromForeign f)
141
151
152+
142-- FFI constructor to build a DateTime from years, months, days, hours, minutes, seconds and millis
153-- FFI constructor to build a DateTime from years, months, days, hours, minutes, seconds and millis
143dateTime
154dateTime
144− :: Int -- ^ years
155+ :: Int -- ^ years
145− -> Int -- ^ months
156+ -> Int -- ^ months
146− -> Int -- ^ days
157+ -> Int -- ^ days
147− -> Int -- ^ hours
158+ -> Int -- ^ hours
148− -> Int -- ^ minutes
159+ -> Int -- ^ minutes
149− -> Int -- ^ seconds
160+ -> Int -- ^ seconds
150− -> Int -- ^ milliseconds
161+ -> Int -- ^ milliseconds
151− -> Nullable DateTime
162+ -> Nullable DateTime
152dateTime y m d h mi s ms =
163dateTime y m d h mi s ms =
153 toNullable $ DateTime
164 toNullable $ DateTime
154− <$> (Date.canonicalDate <$> toEnum y <*> toEnum m <*> toEnum d)
165+ <$> (Date.canonicalDate <$> toEnum y <*> toEnum m <*> toEnum d)
155− <*> (Time <$> toEnum h <*> toEnum mi <*> toEnum s <*> toEnum ms)
166+ <*> (Time <$> toEnum h <*> toEnum mi <*> toEnum s <*> toEnum ms)
167+
156
168
157-- FFI constructor to convert a JS `Date` into a successful `F DateTime`
169-- FFI constructor to convert a JS `Date` into a successful `F DateTime`
158dateTimeF
170dateTimeF
159− :: DateTime
171+ :: DateTime
160− -> F DateTime
172+ -> F DateTime
161dateTimeF =
173dateTimeF =
162 Right >>> Identity >>> ExceptT
174 Right >>> Identity >>> ExceptT
163
175
176+
164-- FFI constructor to convert a string into an errored `F DateTime`
177-- FFI constructor to convert a string into an errored `F DateTime`
165dateTimeE
178dateTimeE
166− :: String
179+ :: String
167− -> F DateTime
180+ -> F DateTime
168dateTimeE =
181dateTimeE =
169 Foreign.TypeMismatch "Date" >>> flip NonEmpty Nil >>> NonEmptyList >>> Left >>> Identity >>> ExceptT
182 Foreign.TypeMismatch "Date" >>> flip NonEmpty Nil >>> NonEmptyList >>> Left >>> Identity >>> ExceptT
170
183
184+
171--------------------
185--------------------
172-- FFI
186-- FFI
173--
187--
174foreign import _dateTimeToForeign
188foreign import _dateTimeToForeign
175− :: Fn7 Int Int Int Int Int Int Int Foreign
189+ :: Fn7 Int Int Int Int Int Int Int Foreign
190+
176
191
177foreign import _readDateTime
192foreign import _readDateTime
178− :: Fn4 (Int -> Int -> Int -> Int -> Int -> Int -> Int -> Nullable DateTime) (DateTime -> F DateTime) (String -> F DateTime) Foreign (F DateTime)
193+ :: Fn4 (Int -> Int -> Int -> Int -> Int -> Int -> Int -> Nullable DateTime) (DateTime -> F DateTime) (String -> F DateTime) Foreign (F DateTime)
194+
179
195
180foreign import _unsafeReadDateTime
196foreign import _unsafeReadDateTime
181− :: Fn2 (Int -> Int -> Int -> Int -> Int -> Int -> Int -> Nullable DateTime) Foreign DateTime
197+ :: Fn2 (Int -> Int -> Int -> Int -> Int -> Int -> Int -> Nullable DateTime) Foreign DateTime
src/Database/IndexedDB/IDBKeyRange.js+9−9
@@ -1,4 +1,4 @@
1−export function _bound(lower, upper, lowerOpen, upperOpen) {
1+exports._bound = function _bound(lower, upper, lowerOpen, upperOpen) {
2 try {
2 try {
3 return IDBKeyRange.bound(lower, upper, lowerOpen, upperOpen);
3 return IDBKeyRange.bound(lower, upper, lowerOpen, upperOpen);
4 } catch (e) {
4 } catch (e) {
@@ -6,34 +6,34 @@ export function _bound(lower, upper, lowerOpen, upperOpen) {
6 }
6 }
7};
7};
8
8
9−export function _includes(range, key) {
9+exports._includes = function _includes(range, key) {
10 return range.includes(key);
10 return range.includes(key);
11};
11};
12
12
13−export function _lower(range) {
13+exports._lower = function _lower(range) {
14 return range.lower;
14 return range.lower;
15};
15};
16
16
17−export function _lowerBound(lower, open) {
17+exports._lowerBound = function _lowerBound(lower, open) {
18 return IDBKeyRange.lowerBound(lower, open);
18 return IDBKeyRange.lowerBound(lower, open);
19};
19};
20
20
21−export function _lowerOpen(range) {
21+exports._lowerOpen = function _lowerOpen(range) {
22 return range.lowerOpen;
22 return range.lowerOpen;
23};
23};
24
24
25−export function _only(key) {
25+exports._only = function _only(key) {
26 return IDBKeyRange.only(key);
26 return IDBKeyRange.only(key);
27};
27};
28
28
29−export function _upper(range) {
29+exports._upper = function _upper(range) {
30 return range.upper;
30 return range.upper;
31};
31};
32
32
33−export function _upperBound(upper, open) {
33+exports._upperBound = function _upperBound(upper, open) {
34 return IDBKeyRange.upperBound(upper, open);
34 return IDBKeyRange.upperBound(upper, open);
35};
35};
36
36
37−export function _upperOpen(range) {
37+exports._upperOpen = function _upperOpen(range) {
38 return range.upperOpen;
38 return range.upperOpen;
39};
39};
src/Database/IndexedDB/IDBKeyRange.purs+42−30
@@ -19,17 +19,18 @@ module Database.IndexedDB.IDBKeyRange
19 , upperOpen
19 , upperOpen
20 ) where
20 ) where
21
21
22−import Prelude (($), (>>>), map)
22+import Prelude (($), (>>>), map)
23
23
24−import Foreign (Foreign)
24+import Data.Foreign (Foreign)
25−import Data.Function.Uncurried as Fn
25+import Data.Function.Uncurried as Fn
26−import Data.Function.Uncurried (Fn2, Fn4)
26+import Data.Function.Uncurried (Fn2, Fn4)
27−import Data.Maybe (Maybe)
27+import Data.Maybe (Maybe)
28−import Data.Nullable (Nullable, toMaybe)
28+import Data.Nullable (Nullable, toMaybe)
29
29
30−import Database.IndexedDB.Core (class IDBKeyRange, KeyRange)
30+import Database.IndexedDB.Core (class IDBKeyRange, KeyRange)
31import Database.IndexedDB.IDBKey.Internal (class IDBKey, Key, toKey, unsafeFromKey)
31import Database.IndexedDB.IDBKey.Internal (class IDBKey, Key, toKey, unsafeFromKey)
32
32
33+
33--------------------
34--------------------
34-- TYPES
35-- TYPES
35--
36--
@@ -37,54 +38,55 @@ import Database.IndexedDB.IDBKey.Internal (class IDBKey, Key, toKey, unsafeFromK
37-- | Type alias for open
38-- | Type alias for open
38type Open = Boolean
39type Open = Boolean
39
40
41+
40--------------------
42--------------------
41-- CONSTRUCTORS
43-- CONSTRUCTORS
42--
44--
43
45
44-- | Returns a new IDBKeyRange spanning only key.
46-- | Returns a new IDBKeyRange spanning only key.
45only
47only
46− :: forall a
48+ :: forall a. (IDBKey a)
47− . (IDBKey a)
48− => a
49+ => a
49− -> KeyRange
50+ -> KeyRange
50only key =
51only key =
51 _only (unsafeFromKey $ toKey key)
52 _only (unsafeFromKey $ toKey key)
52
53
54+
53-- | Returns a new IDBKeyRange starting at key with no upper bound.
55-- | Returns a new IDBKeyRange starting at key with no upper bound.
54-- | If `Open` is `true`, key is not included in the range.
56-- | If `Open` is `true`, key is not included in the range.
55lowerBound
57lowerBound
56− :: forall a
58+ :: forall a. (IDBKey a)
57− . (IDBKey a)
58− => a
59+ => a
59− -> Open
60+ -> Open
60− -> KeyRange
61+ -> KeyRange
61lowerBound key open =
62lowerBound key open =
62 Fn.runFn2 _lowerBound (unsafeFromKey $ toKey key) open
63 Fn.runFn2 _lowerBound (unsafeFromKey $ toKey key) open
63
64
65+
64-- | Returns a new IDBKeyRange with no lower bound and ending at key.
66-- | Returns a new IDBKeyRange with no lower bound and ending at key.
65-- | If `Open` is `true`, key is not included in the range.
67-- | If `Open` is `true`, key is not included in the range.
66upperBound
68upperBound
67− :: forall a
69+ :: forall a. (IDBKey a)
68− . (IDBKey a)
69− => a
70+ => a
70− -> Open
71+ -> Open
71− -> KeyRange
72+ -> KeyRange
72upperBound key open =
73upperBound key open =
73 Fn.runFn2 _upperBound (unsafeFromKey $ toKey key) open
74 Fn.runFn2 _upperBound (unsafeFromKey $ toKey key) open
74
75
76+
75-- | Returns a new IDBKeyRange spanning from `lower` to `upper`.
77-- | Returns a new IDBKeyRange spanning from `lower` to `upper`.
76-- | If `lowerOpen` is `true`, `lower` is not included in the range.
78-- | If `lowerOpen` is `true`, `lower` is not included in the range.
77-- | If `upperOpen` is `true`, `upper` is not included in the range.
79-- | If `upperOpen` is `true`, `upper` is not included in the range.
78-- |
80-- |
79-- | It throws a `DataError` if the bound is invalid.
81-- | It throws a `DataError` if the bound is invalid.
80bound
82bound
81− :: forall key
83+ :: forall key. (IDBKey key)
82− . (IDBKey key)
83− => { lower :: key, upper :: key, lowerOpen :: Boolean, upperOpen :: Boolean }
84+ => { lower :: key, upper :: key, lowerOpen :: Boolean, upperOpen :: Boolean }
84− -> Maybe KeyRange
85+ -> Maybe KeyRange
85bound { lower: key1, upper: key2, lowerOpen: open1, upperOpen: open2 } =
86bound { lower: key1, upper: key2, lowerOpen: open1, upperOpen: open2 } =
86 toMaybe
87 toMaybe
87− $ Fn.runFn4 _bound (unsafeFromKey $ toKey key1) (unsafeFromKey $ toKey key2) open1 open2
88+ $ Fn.runFn4 _bound (unsafeFromKey $ toKey key1) (unsafeFromKey $ toKey key2) open1 open2
89+
88
90
89--------------------
91--------------------
90-- INTERFACE
92-- INTERFACE
@@ -92,15 +94,14 @@ bound { lower: key1, upper: key2, lowerOpen: open1, upperOpen: open2 } =
92
94
93-- | Returns true if key is included in the range, and false otherwise.
95-- | Returns true if key is included in the range, and false otherwise.
94includes
96includes
95− :: forall key range
96− . (IDBKey key)
97− => (IDBKeyRange range)
97+ :: forall key range. (IDBKey key) => (IDBKeyRange range)
98 => range
98 => range
99 -> key
99 -> key
100 -> Boolean
100 -> Boolean
101includes range =
101includes range =
102 toKey >>> unsafeFromKey >>> Fn.runFn2 _includes range
102 toKey >>> unsafeFromKey >>> Fn.runFn2 _includes range
103
103
104+
104--------------------
105--------------------
105-- ATTRIBUTES
106-- ATTRIBUTES
106--
107--
@@ -111,6 +112,7 @@ lower
111lower =
112lower =
112 _lower >>> toMaybe >>> map toKey
113 _lower >>> toMaybe >>> map toKey
113
114
115+
114-- | Returns upper bound if any.
116-- | Returns upper bound if any.
115upper
117upper
116 :: KeyRange
118 :: KeyRange
@@ -118,6 +120,7 @@ upper
118upper =
120upper =
119 _upper >>> toMaybe >>> map toKey
121 _upper >>> toMaybe >>> map toKey
120
122
123+
121-- | Returns true if the lower open flag is set, false otherwise.
124-- | Returns true if the lower open flag is set, false otherwise.
122lowerOpen
125lowerOpen
123 :: KeyRange
126 :: KeyRange
@@ -125,6 +128,7 @@ lowerOpen
125lowerOpen =
128lowerOpen =
126 _lowerOpen
129 _lowerOpen
127
130
131+
128-- | Returns true if the upper open flag is set, false otherwise.
132-- | Returns true if the upper open flag is set, false otherwise.
129upperOpen
133upperOpen
130 :: KeyRange
134 :: KeyRange
@@ -132,6 +136,7 @@ upperOpen
132upperOpen =
136upperOpen =
133 _upperOpen
137 _upperOpen
134
138
139+
135--------------------
140--------------------
136-- FFI
141-- FFI
137--
142--
@@ -143,28 +148,35 @@ foreign import _only
143foreign import _lowerBound
148foreign import _lowerBound
144 :: Fn2 Foreign Boolean KeyRange
149 :: Fn2 Foreign Boolean KeyRange
145
150
151+
146foreign import _upperBound
152foreign import _upperBound
147 :: Fn2 Foreign Boolean KeyRange
153 :: Fn2 Foreign Boolean KeyRange
148
154
155+
149foreign import _bound
156foreign import _bound
150 :: Fn4 Foreign Foreign Boolean Boolean (Nullable KeyRange)
157 :: Fn4 Foreign Foreign Boolean Boolean (Nullable KeyRange)
151
158
159+
152foreign import _includes
160foreign import _includes
153 :: forall range
161 :: forall range
154− . Fn2 range Foreign Boolean
162+ . Fn2 range Foreign Boolean
163+
155
164
156foreign import _lower
165foreign import _lower
157 :: KeyRange
166 :: KeyRange
158 -> Nullable Foreign
167 -> Nullable Foreign
159
168
169+
160foreign import _upper
170foreign import _upper
161 :: KeyRange
171 :: KeyRange
162 -> Nullable Foreign
172 -> Nullable Foreign
163
173
174+
164foreign import _lowerOpen
175foreign import _lowerOpen
165 :: KeyRange
176 :: KeyRange
166 -> Boolean
177 -> Boolean
167
178
179+
168foreign import _upperOpen
180foreign import _upperOpen
169 :: KeyRange
181 :: KeyRange
170 -> Boolean
182 -> Boolean
src/Database/IndexedDB/IDBObjectStore.js+12−12
@@ -15,7 +15,7 @@ const toArray = function toArray(xs) {
15};
15};
16
16
17
17
18−export function _add(store, value, key) {
18+exports._add = function _add(store, value, key) {
19 return function aff(error, success) {
19 return function aff(error, success) {
20 try {
20 try {
21 const request = store.add(value, key || undefined);
21 const request = store.add(value, key || undefined);
@@ -31,11 +31,11 @@ export function _add(store, value, key) {
31 };
31 };
32};
32};
33
33
34−export function _autoIncrement(store) {
34+exports._autoIncrement = function _autoIncrement(store) {
35 return store.autoIncrement;
35 return store.autoIncrement;
36};
36};
37
37
38−export function _clear(store) {
38+exports._clear = function _clear(store) {
39 return function aff(error, success) {
39 return function aff(error, success) {
40 try {
40 try {
41 const request = store.clear();
41 const request = store.clear();
@@ -51,7 +51,7 @@ export function _clear(store) {
51 };
51 };
52};
52};
53
53
54−export function _createIndex(store, name, path, params) {
54+exports._createIndex = function _createIndex(store, name, path, params) {
55 return function aff(error, success) {
55 return function aff(error, success) {
56 var keyPath;
56 var keyPath;
57
57
@@ -81,7 +81,7 @@ export function _createIndex(store, name, path, params) {
81 };
81 };
82};
82};
83
83
84−export function _deleteIndex(store, name) {
84+exports._deleteIndex = function _deleteIndex(store, name) {
85 return function aff(error, success) {
85 return function aff(error, success) {
86 try {
86 try {
87 store.deleteIndex(name);
87 store.deleteIndex(name);
@@ -96,7 +96,7 @@ export function _deleteIndex(store, name) {
96 };
96 };
97};
97};
98
98
99−export function _delete(store, query) {
99+exports._delete = function _delete(store, query) {
100 return function aff(error, success) {
100 return function aff(error, success) {
101 try {
101 try {
102 const request = store.delete(query);
102 const request = store.delete(query);
@@ -112,7 +112,7 @@ export function _delete(store, query) {
112 };
112 };
113};
113};
114
114
115−export function _index(store, name) {
115+exports._index = function _index(store, name) {
116 return function aff(error, success) {
116 return function aff(error, success) {
117 try {
117 try {
118 const index = store.index(name);
118 const index = store.index(name);
@@ -127,11 +127,11 @@ export function _index(store, name) {
127 };
127 };
128};
128};
129
129
130−export function _indexNames(store) {
130+exports._indexNames = function _indexNames(store) {
131 return toArray(store.indexNames);
131 return toArray(store.indexNames);
132};
132};
133
133
134−export function _keyPath(store) {
134+exports._keyPath = function _keyPath(store) {
135 const path = store.keyPath;
135 const path = store.keyPath;
136
136
137 if (Array.isArray(path)) {
137 if (Array.isArray(path)) {
@@ -145,11 +145,11 @@ export function _keyPath(store) {
145 return [];
145 return [];
146};
146};
147
147
148−export function _name(store) {
148+exports._name = function _name(store) {
149 return store.name;
149 return store.name;
150};
150};
151
151
152−export function _put(store, value, key) {
152+exports._put = function _put(store, value, key) {
153 return function aff(error, success) {
153 return function aff(error, success) {
154 try {
154 try {
155 const request = store.put(value, key || undefined);
155 const request = store.put(value, key || undefined);
@@ -165,6 +165,6 @@ export function _put(store, value, key) {
165 };
165 };
166};
166};
167
167
168−export function _transaction(store) {
168+exports._transaction = function _transaction(store) {
169 return store.transaction;
169 return store.transaction;
170};
170};
src/Database/IndexedDB/IDBObjectStore.purs+76−58
@@ -25,18 +25,19 @@ module Database.IndexedDB.IDBObjectStore
25 , module Database.IndexedDB.IDBIndex
25 , module Database.IndexedDB.IDBIndex
26 ) where
26 ) where
27
27
28−import Database.IndexedDB.Core
28+import Prelude (Unit, map, ($), (<$>), (>>>), (<<<))
29+
30+import Control.Monad.Aff (Aff)
31+import Control.Monad.Aff.Compat (EffFnAff, fromEffFnAff)
32+import Data.Foreign (Foreign)
33+import Data.Function.Uncurried as Fn
34+import Data.Function.Uncurried (Fn2, Fn3, Fn4)
35+import Data.Maybe (Maybe)
36+import Data.Nullable (Nullable, toNullable)
29
37
30−import Data.Function.Uncurried (Fn2, Fn3, Fn4)
38+import Database.IndexedDB.Core
31−import Data.Function.Uncurried as Fn
32−import Data.Maybe (Maybe)
33−import Data.Nullable (Nullable, toNullable)
34−import Database.IndexedDB.IDBIndex (count, get, getAllKeys, getKey, openCursor, openKeyCursor)
39+import Database.IndexedDB.IDBIndex (count, get, getAllKeys, getKey, openCursor, openKeyCursor)
35import Database.IndexedDB.IDBKey.Internal (class IDBKey, Key, unsafeFromKey, toKey)
40import Database.IndexedDB.IDBKey.Internal (class IDBKey, Key, unsafeFromKey, toKey)
36−import Effect.Aff (Aff)
37−import Effect.Aff.Compat (EffectFnAff, fromEffectFnAff)
38−import Foreign (Foreign)
39−import Prelude (Unit, map, ($), (<$>), (>>>), (<<<))
40
41
41--------------------
42--------------------
42-- TYPES
43-- TYPES
@@ -45,6 +46,7 @@ import Prelude (Unit, map, ($), (<$>), (>>>), (<<<))
45-- | Type alias for IndexName
46-- | Type alias for IndexName
46type IndexName = String
47type IndexName = String
47
48
49+
48-- | Flags to set on the index.
50-- | Flags to set on the index.
49-- |
51-- |
50-- | An index has a `unique` flag. When this flag is set, the index enforces that no
52-- | An index has a `unique` flag. When this flag is set, the index enforces that no
@@ -59,16 +61,18 @@ type IndexName = String
59-- | If the `multiEntry` flag is true, then the one record is added to the index for each
61-- | If the `multiEntry` flag is true, then the one record is added to the index for each
60-- | of the subkeys.
62-- | of the subkeys.
61type IndexParameters =
63type IndexParameters =
62− { unique :: Boolean
64+ { unique :: Boolean
63 , multiEntry :: Boolean
65 , multiEntry :: Boolean
64 }
66 }
65
67
68+
66defaultParameters :: IndexParameters
69defaultParameters :: IndexParameters
67defaultParameters =
70defaultParameters =
68− { unique: false
71+ { unique : false
69− , multiEntry: false
72+ , multiEntry : false
70 }
73 }
71
74
75+
72--------------------
76--------------------
73-- INTERFACES
77-- INTERFACES
74--
78--
@@ -81,24 +85,23 @@ defaultParameters =
81-- | If add() is used, and if a record with the key already exists the request will fail,
85-- | If add() is used, and if a record with the key already exists the request will fail,
82-- | with a "ConstraintError" DOMException.
86-- | with a "ConstraintError" DOMException.
83add
87add
84− :: forall key val store
85− . (IDBKey key)
86− => (IDBObjectStore store)
88+ :: forall e key val store. (IDBKey key) => (IDBObjectStore store)
87 => store
89 => store
88 -> val
90 -> val
89 -> Maybe key
91 -> Maybe key
90− -> Aff Key
92+ -> Aff (idb :: IDB | e) Key
91add store value key =
93add store value key =
92− map toKey $ fromEffectFnAff $ Fn.runFn3 _add store value (toNullable $ (toKey >>> unsafeFromKey) <$> key)
94+ map toKey $ fromEffFnAff $ Fn.runFn3 _add store value (toNullable $ (toKey >>> unsafeFromKey) <$> key)
95+
93
96
94-- | Deletes all records in store.
97-- | Deletes all records in store.
95clear
98clear
96− :: forall store
97− . (IDBObjectStore store)
99+ :: forall e store. (IDBObjectStore store)
98 => store
100 => store
99− -> Aff Unit
101+ -> Aff (idb :: IDB | e) Unit
100clear =
102clear =
101− fromEffectFnAff <<< _clear
103+ fromEffFnAff <<< _clear
104+
102
105
103-- | Creates a new index in store with the given name, keyPath and options and
106-- | Creates a new index in store with the given name, keyPath and options and
104-- | returns a new IDBIndex. If the keyPath and options define constraints that
107-- | returns a new IDBIndex. If the keyPath and options define constraints that
@@ -107,47 +110,47 @@ clear =
107-- |
110-- |
108-- | Throws an "InvalidStateError" DOMException if not called within an upgrade transaction.
111-- | Throws an "InvalidStateError" DOMException if not called within an upgrade transaction.
109createIndex
112createIndex
110− :: forall store
111− . (IDBObjectStore store)
113+ :: forall e store. (IDBObjectStore store)
112 => store
114 => store
113 -> IndexName
115 -> IndexName
114 -> KeyPath
116 -> KeyPath
115 -> IndexParameters
117 -> IndexParameters
116− -> Aff Index
118+ -> Aff (idb :: IDB | e) Index
117createIndex store name' path params =
119createIndex store name' path params =
118− fromEffectFnAff $ Fn.runFn4 _createIndex store name' path params
120+ fromEffFnAff $ Fn.runFn4 _createIndex store name' path params
121+
119
122
120-- | Deletes records in store with the given key or in the given key range in query.
123-- | Deletes records in store with the given key or in the given key range in query.
121delete
124delete
122− :: forall store
123− . (IDBObjectStore store)
125+ :: forall e store. (IDBObjectStore store)
124 => store
126 => store
125 -> KeyRange
127 -> KeyRange
126− -> Aff Unit
128+ -> Aff (idb :: IDB | e) Unit
127delete store range =
129delete store range =
128− fromEffectFnAff $ Fn.runFn2 _delete store range
130+ fromEffFnAff $ Fn.runFn2 _delete store range
131+
129
132
130-- | Deletes the index in store with the given name.
133-- | Deletes the index in store with the given name.
131-- |
134-- |
132-- | Throws an "InvalidStateError" DOMException if not called within an upgrade transaction.
135-- | Throws an "InvalidStateError" DOMException if not called within an upgrade transaction.
133deleteIndex
136deleteIndex
134− :: forall store
135− . (IDBObjectStore store)
137+ :: forall e store. (IDBObjectStore store)
136 => store
138 => store
137 -> IndexName
139 -> IndexName
138− -> Aff Unit
140+ -> Aff (idb :: IDB | e) Unit
139deleteIndex store name' =
141deleteIndex store name' =
140− fromEffectFnAff $ Fn.runFn2 _deleteIndex store name'
142+ fromEffFnAff $ Fn.runFn2 _deleteIndex store name'
143+
141
144
142-- | Returns an IDBIndex for the index named name in store.
145-- | Returns an IDBIndex for the index named name in store.
143index
146index
144− :: forall store
145− . (IDBObjectStore store)
147+ :: forall e store. (IDBObjectStore store)
146 => store
148 => store
147 -> IndexName
149 -> IndexName
148− -> Aff Index
150+ -> Aff (idb :: IDB | e) Index
149index store name' =
151index store name' =
150− fromEffectFnAff $ Fn.runFn2 _index store name'
152+ fromEffFnAff $ Fn.runFn2 _index store name'
153+
151
154
152-- | Adds or updates a record in store with the given value and key.
155-- | Adds or updates a record in store with the given value and key.
153-- |
156-- |
@@ -156,15 +159,14 @@ index store name' =
156-- |
159-- |
157-- | If put() is used, any existing record with the key will be replaced.
160-- | If put() is used, any existing record with the key will be replaced.
158put
161put
159− :: forall val key store
160− . (IDBKey key)
161− => (IDBObjectStore store)
162+ :: forall e val key store. (IDBKey key) => (IDBObjectStore store)
162 => store
163 => store
163 -> val
164 -> val
164 -> Maybe key
165 -> Maybe key
165− -> Aff Key
166+ -> Aff (idb :: IDB | e) Key
166put store value key =
167put store value key =
167− map toKey $ fromEffectFnAff $ Fn.runFn3 _put store value (toNullable $ (toKey >>> unsafeFromKey) <$> key)
168+ map toKey $ fromEffFnAff $ Fn.runFn3 _put store value (toNullable $ (toKey >>> unsafeFromKey) <$> key)
169+
168
170
169--------------------
171--------------------
170-- ATTRIBUTES
172-- ATTRIBUTES
@@ -176,6 +178,7 @@ autoIncrement
176autoIncrement =
178autoIncrement =
177 _autoIncrement
179 _autoIncrement
178
180
181+
179--| Returns a list of the names of indexes in the store.
182--| Returns a list of the names of indexes in the store.
180indexNames
183indexNames
181 :: ObjectStore
184 :: ObjectStore
@@ -183,6 +186,7 @@ indexNames
183indexNames =
186indexNames =
184 _indexNames
187 _indexNames
185
188
189+
186-- | Returns the key path of the store, or empty array if none
190-- | Returns the key path of the store, or empty array if none
187keyPath
191keyPath
188 :: ObjectStore
192 :: ObjectStore
@@ -190,6 +194,7 @@ keyPath
190keyPath =
194keyPath =
191 _keyPath
195 _keyPath
192
196
197+
193-- | Returns the name of the store.
198-- | Returns the name of the store.
194name
199name
195 :: ObjectStore
200 :: ObjectStore
@@ -197,6 +202,7 @@ name
197name =
202name =
198 _name
203 _name
199
204
205+
200-- | Returns the associated transaction.
206-- | Returns the associated transaction.
201transaction
207transaction
202 :: ObjectStore
208 :: ObjectStore
@@ -204,53 +210,65 @@ transaction
204transaction =
210transaction =
205 _transaction
211 _transaction
206
212
213+
207--------------------
214--------------------
208-- FFI
215-- FFI
209--
216--
210foreign import _add
217foreign import _add
211− :: forall val store
218+ :: forall e val store
212− . Fn3 store val (Nullable Foreign) (EffectFnAff Foreign)
219+ . Fn3 store val (Nullable Foreign) (EffFnAff (idb :: IDB | e) Foreign)
220+
213
221
214foreign import _autoIncrement
222foreign import _autoIncrement
215 :: ObjectStore
223 :: ObjectStore
216 -> Boolean
224 -> Boolean
217
225
226+
218foreign import _clear
227foreign import _clear
219− :: forall store
228+ :: forall e store
220− . store
229+ . store
221− -> EffectFnAff Unit
230+ -> EffFnAff (idb :: IDB | e) Unit
231+
222
232
223foreign import _createIndex
233foreign import _createIndex
224− :: forall store
234+ :: forall e store
225− . Fn4 store String (Array String) { unique :: Boolean, multiEntry :: Boolean } (EffectFnAff Index)
235+ . Fn4 store String (Array String) { unique :: Boolean, multiEntry :: Boolean } (EffFnAff (idb :: IDB | e) Index)
236+
226
237
227foreign import _delete
238foreign import _delete
228− :: forall store
239+ :: forall e store
229− . Fn2 store KeyRange (EffectFnAff Unit)
240+ . Fn2 store KeyRange (EffFnAff (idb :: IDB | e) Unit)
241+
230
242
231foreign import _deleteIndex
243foreign import _deleteIndex
232− :: forall store
244+ :: forall e store
233− . Fn2 store String (EffectFnAff Unit)
245+ . Fn2 store String (EffFnAff (idb :: IDB | e) Unit)
246+
234
247
235foreign import _index
248foreign import _index
236− :: forall store
249+ :: forall e store
237− . Fn2 store String (EffectFnAff Index)
250+ . Fn2 store String (EffFnAff (idb :: IDB | e) Index)
251+
238
252
239foreign import _indexNames
253foreign import _indexNames
240 :: ObjectStore
254 :: ObjectStore
241 -> Array String
255 -> Array String
242
256
257+
243foreign import _keyPath
258foreign import _keyPath
244 :: ObjectStore
259 :: ObjectStore
245 -> Array String
260 -> Array String
246
261
262+
247foreign import _name
263foreign import _name
248 :: ObjectStore
264 :: ObjectStore
249 -> String
265 -> String
250
266
267+
251foreign import _put
268foreign import _put
252− :: forall val store
269+ :: forall e val store
253− . Fn3 store val (Nullable Foreign) (EffectFnAff Foreign)
270+ . Fn3 store val (Nullable Foreign) (EffFnAff (idb :: IDB | e) Foreign)
271+
254
272
255foreign import _transaction
273foreign import _transaction
256 :: ObjectStore
274 :: ObjectStore
src/Database/IndexedDB/IDBTransaction.js+9−9
@@ -1,4 +1,4 @@
1−export function _abort(tx) {
1+exports._abort = function _abort(tx) {
2 return function aff(error, success) {
2 return function aff(error, success) {
3 try {
3 try {
4 tx.abort();
4 tx.abort();
@@ -13,17 +13,17 @@ export function _abort(tx) {
13 };
13 };
14};
14};
15
15
16−export function _db(tx) {
16+exports._db = function _db(tx) {
17 return tx.db;
17 return tx.db;
18};
18};
19
19
20−export function _error(tx) {
20+exports._error = function _error(tx) {
21 return tx.error == null
21 return tx.error == null
22 ? null
22 ? null
23 : tx.error;
23 : tx.error;
24};
24};
25
25
26−export function _mode(ReadOnly, ReadWrite, VersionChange, tx) {
26+exports._mode = function _mode(ReadOnly, ReadWrite, VersionChange, tx) {
27 if (tx.mode === 'readwrite') {
27 if (tx.mode === 'readwrite') {
28 return ReadWrite;
28 return ReadWrite;
29 } else if (tx.mode === 'versionchange') {
29 } else if (tx.mode === 'versionchange') {
@@ -33,7 +33,7 @@ export function _mode(ReadOnly, ReadWrite, VersionChange, tx) {
33 return ReadOnly;
33 return ReadOnly;
34};
34};
35
35
36−export function _objectStore(tx, name) {
36+exports._objectStore = function _objectStore(tx, name) {
37 return function aff(error, success) {
37 return function aff(error, success) {
38 try {
38 try {
39 const store = tx.objectStore(name);
39 const store = tx.objectStore(name);
@@ -48,11 +48,11 @@ export function _objectStore(tx, name) {
48 };
48 };
49};
49};
50
50
51−export function _objectStoreNames(tx) {
51+exports._objectStoreNames = function _objectStoreNames(tx) {
52 return tx.objectStoreNames;
52 return tx.objectStoreNames;
53};
53};
54
54
55−export function _onAbort(tx, f) {
55+exports._onAbort = function _onAbort(tx, f) {
56 return function aff(error, success) {
56 return function aff(error, success) {
57 tx.onabort = function onabort() {
57 tx.onabort = function onabort() {
58 f();
58 f();
@@ -65,7 +65,7 @@ export function _onAbort(tx, f) {
65 };
65 };
66};
66};
67
67
68−export function _onComplete(tx, f) {
68+exports._onComplete = function _onComplete(tx, f) {
69 return function aff(error, success) {
69 return function aff(error, success) {
70 tx.oncomplete = function oncomplete() {
70 tx.oncomplete = function oncomplete() {
71 f();
71 f();
@@ -78,7 +78,7 @@ export function _onComplete(tx, f) {
78 };
78 };
79};
79};
80
80
81−export function _onError(tx, f) {
81+exports._onError = function _onError(tx, f) {
82 return function aff(error, success) {
82 return function aff(error, success) {
83 tx.onerror = function onerror(e) {
83 tx.onerror = function onerror(e) {
84 f(e.target.error)();
84 f(e.target.error)();
src/Database/IndexedDB/IDBTransaction.purs+59−40
@@ -14,17 +14,19 @@ module Database.IndexedDB.IDBTransaction
14 , onError
14 , onError
15 ) where
15 ) where
16
16
17+import Prelude (Unit, ($), (<<<), (>>>))
18+
19+import Control.Monad.Aff (Aff)
20+import Control.Monad.Aff.Compat (EffFnAff, fromEffFnAff)
21+import Control.Monad.Eff (Eff)
22+import Control.Monad.Eff.Exception (Error)
23+import Data.Function.Uncurried as Fn
24+import Data.Function.Uncurried (Fn2, Fn4)
25+import Data.Maybe (Maybe)
26+import Data.Nullable (Nullable, toMaybe)
27+
17import Database.IndexedDB.Core
28import Database.IndexedDB.Core
18
29
19−import Data.Function.Uncurried (Fn2, Fn4)
20−import Data.Function.Uncurried as Fn
21−import Data.Maybe (Maybe)
22−import Data.Nullable (Nullable, toMaybe)
23−import Effect (Effect)
24−import Effect.Aff (Aff)
25−import Effect.Aff.Compat (EffectFnAff, fromEffectFnAff)
26−import Effect.Exception (Error)
27−import Prelude (Unit, ($), (<<<), (>>>))
28
30
29--------------------
31--------------------
30-- INTERFACES
32-- INTERFACES
@@ -33,22 +35,21 @@ import Prelude (Unit, ($), (<<<), (>>>))
33-- | Aborts the transaction. All pending requests will fail with a "AbortError"
35-- | Aborts the transaction. All pending requests will fail with a "AbortError"
34-- | DOMException and all changes made to the database will be reverted.
36-- | DOMException and all changes made to the database will be reverted.
35abort
37abort
36− :: forall tx
37− . (IDBTransaction tx)
38+ :: forall e tx. (IDBTransaction tx)
38 => tx
39 => tx
39− -> Aff Unit
40+ -> Aff (idb :: IDB | e) Unit
40abort =
41abort =
41− fromEffectFnAff <<< _abort
42+ fromEffFnAff <<< _abort
42
43
43-- | Returns an IDBObjectStore in the transaction's scope.
44-- | Returns an IDBObjectStore in the transaction's scope.
44objectStore
45objectStore
45− :: forall tx
46− . (IDBTransaction tx)
46+ :: forall e tx. (IDBTransaction tx)
47 => tx
47 => tx
48 -> String
48 -> String
49− -> Aff ObjectStore
49+ -> Aff (idb :: IDB | e) ObjectStore
50objectStore tx name =
50objectStore tx name =
51− fromEffectFnAff $ Fn.runFn2 _objectStore tx name
51+ fromEffFnAff $ Fn.runFn2 _objectStore tx name
52+
52
53
53--------------------
54--------------------
54-- ATTRIBUTES
55-- ATTRIBUTES
@@ -61,6 +62,7 @@ db
61db =
62db =
62 _db
63 _db
63
64
65+
64-- | If the transaction was aborted, returns the error (a DOMException) providing the reason.
66-- | If the transaction was aborted, returns the error (a DOMException) providing the reason.
65error
67error
66 :: Transaction
68 :: Transaction
@@ -68,6 +70,7 @@ error
68error =
70error =
69 _error >>> toMaybe
71 _error >>> toMaybe
70
72
73+
71-- | Returns the mode the transaction was created with (`ReadOnly|ReadWrite`)
74-- | Returns the mode the transaction was created with (`ReadOnly|ReadWrite`)
72-- | , or `VersionChange` for an upgrade transaction.
75-- | , or `VersionChange` for an upgrade transaction.
73mode
76mode
@@ -76,6 +79,7 @@ mode
76mode =
79mode =
77 Fn.runFn4 _mode ReadOnly ReadWrite VersionChange
80 Fn.runFn4 _mode ReadOnly ReadWrite VersionChange
78
81
82+
79-- | Returns a list of the names of object stores in the transaction’s scope.
83-- | Returns a list of the names of object stores in the transaction’s scope.
80-- | For an upgrade transaction this is all object stores in the database.
84-- | For an upgrade transaction this is all object stores in the database.
81objectStoreNames
85objectStoreNames
@@ -84,70 +88,85 @@ objectStoreNames
84objectStoreNames =
88objectStoreNames =
85 _objectStoreNames
89 _objectStoreNames
86
90
91+
87--------------------
92--------------------
88-- EVENT HANDLERS
93-- EVENT HANDLERS
89--
94--
90
95
91-- | Event handler for the `abort` event.
96-- | Event handler for the `abort` event.
92onAbort
97onAbort
98+ :: forall e e'
93− :: Transaction
99+ . Transaction
94− -> Effect Unit
100+ -> Eff ( | e') Unit
95− -> Aff Unit
101+ -> Aff (idb :: IDB | e) Unit
96onAbort db' f =
102onAbort db' f =
97− fromEffectFnAff $ Fn.runFn2 _onAbort db' f
103+ fromEffFnAff $ Fn.runFn2 _onAbort db' f
104+
98
105
99-- | Event handler for the `complete` event.
106-- | Event handler for the `complete` event.
100onComplete
107onComplete
108+ :: forall e e'
101− :: Transaction
109+ . Transaction
102− -> Effect Unit
110+ -> Eff ( | e') Unit
103− -> Aff Unit
111+ -> Aff (idb :: IDB | e) Unit
104onComplete db' f =
112onComplete db' f =
105− fromEffectFnAff $ Fn.runFn2 _onComplete db' f
113+ fromEffFnAff $ Fn.runFn2 _onComplete db' f
114+
106
115
107-- | Event handler for the `error` event.
116-- | Event handler for the `error` event.
108onError
117onError
118+ :: forall e e'
109− :: Transaction
119+ . Transaction
110− -> (Error -> Effect Unit)
120+ -> (Error -> Eff ( | e') Unit)
111− -> Aff Unit
121+ -> Aff (idb :: IDB | e) Unit
112onError db' f =
122onError db' f =
113− fromEffectFnAff $ Fn.runFn2 _onError db' f
123+ fromEffFnAff $ Fn.runFn2 _onError db' f
124+
114
125
115--------------------
126--------------------
116-- FFI
127-- FFI
117--
128--
118
129
119foreign import _abort
130foreign import _abort
120− :: forall tx
131+ :: forall tx e
121− . tx
132+ . tx
122− -> EffectFnAff Unit
133+ -> EffFnAff (idb :: IDB | e) Unit
134+
123
135
124foreign import _db
136foreign import _db
125 :: Transaction
137 :: Transaction
126 -> Database
138 -> Database
127
139
140+
128foreign import _error
141foreign import _error
129 :: Transaction
142 :: Transaction
130 -> (Nullable Error)
143 -> (Nullable Error)
131
144
145+
132foreign import _mode
146foreign import _mode
133 :: Fn4 TransactionMode TransactionMode TransactionMode Transaction TransactionMode
147 :: Fn4 TransactionMode TransactionMode TransactionMode Transaction TransactionMode
134
148
149+
135foreign import _objectStoreNames
150foreign import _objectStoreNames
136 :: Transaction
151 :: Transaction
137 -> Array String
152 -> Array String
138
153
154+
139foreign import _objectStore
155foreign import _objectStore
140− :: forall tx
156+ :: forall tx e
141− . Fn2 tx String (EffectFnAff ObjectStore)
157+ . Fn2 tx String (EffFnAff (idb :: IDB | e) ObjectStore)
158+
142
159
143foreign import _onAbort
160foreign import _onAbort
144− :: forall tx
161+ :: forall tx e e'
145− . Fn2 tx (Effect Unit) (EffectFnAff Unit)
162+ . Fn2 tx (Eff ( | e') Unit) (EffFnAff (idb :: IDB | e) Unit)
163+
146
164
147foreign import _onComplete
165foreign import _onComplete
148− :: forall tx
166+ :: forall tx e e'
149− . Fn2 tx (Effect Unit) (EffectFnAff Unit)
167+ . Fn2 tx (Eff ( | e') Unit) (EffFnAff (idb :: IDB | e) Unit)
168+
150
169
151foreign import _onError
170foreign import _onError
152− :: forall tx
171+ :: forall tx e e'
153− . Fn2 tx (Error -> Effect Unit) (EffectFnAff Unit)
172+ . Fn2 tx (Error -> Eff ( | e') Unit) (EffFnAff (idb :: IDB | e) Unit)
test/Main.purs+910−971
@@ -2,1060 +2,1004 @@ module Test.Main where
2
2
3import Prelude
3import Prelude
4
4
5−import Data.Array (head, drop)
5+import Control.Monad.Aff (Aff, launchAff, launchAff_, forkAff, delay, attempt)
6+import Control.Monad.Aff.AVar (AVAR, AVar, makeVar, makeEmptyVar, readVar, putVar, takeVar)
7+import Control.Monad.Aff.Console (log)
8+import Control.Monad.Eff (Eff)
9+import Control.Monad.Eff.Class (liftEff)
10+import Control.Monad.Eff.Exception (EXCEPTION, name)
11+import Control.Monad.Eff.Now (NOW, now)
6−import Data.Date as Date
12+import Data.Date as Date
7−import Data.DateTime (DateTime(..), Time(..))
13+import Data.DateTime as DateTime
14+import Data.DateTime (DateTime(..), Time(..))
8−import Data.DateTime.Instant (toDateTime)
15+import Data.DateTime.Instant (toDateTime)
9−import Data.Either (Either(..))
16+import Data.Either (Either(..))
10−import Data.Enum (toEnum)
17+import Data.Enum (toEnum)
11−import Data.Maybe (Maybe(..), isNothing, maybe)
18+import Data.Maybe (Maybe(..), isNothing, maybe)
19+import Data.Array (head, drop)
12−import Data.Time.Duration (Milliseconds(..))
20+import Data.Time.Duration (Milliseconds(..))
13−import Data.Traversable (traverse)
21+import Data.Traversable (traverse)
14−import Data.Tuple (Tuple(..), uncurry)
22+import Data.Tuple (Tuple(..), uncurry)
15−import Database.IndexedDB.Core (CursorDirection(..), Database, Index, ObjectStore, Transaction, TransactionMode(..))
16−import Database.IndexedDB.IDBCursor as IDBCursor
17−import Database.IndexedDB.IDBDatabase as IDBDatabase
18−import Database.IndexedDB.IDBFactory as IDBFactory
19−import Database.IndexedDB.IDBIndex as IDBIndex
20−import Database.IndexedDB.IDBKey (Key, none, toKey)
21−import Database.IndexedDB.IDBKeyRange as IDBKeyRange
22−import Database.IndexedDB.IDBObjectStore as IDBObjectStore
23−import Database.IndexedDB.IDBTransaction as IDBTransaction
24−import Effect (Effect)
25−import Effect.Aff (Aff, attempt, delay, forkAff, launchAff, launchAff_)
26−import Effect.Aff.AVar (AVar)
27−import Effect.Aff.AVar as AVar
28−import Effect.Class (liftEffect)
29−import Effect.Console (log)
30−import Effect.Exception (name)
31−import Effect.Now (now)
32−import Test.Spec (describe, it)
23+import Test.Spec (describe, describeOnly, it)
33−import Test.Spec.Assertions (shouldEqual, fail)
24+import Test.Spec.Assertions (shouldEqual, fail)
34−import Test.Spec.Reporter (consoleReporter)
25+import Test.Spec.Mocha (MOCHA, runMocha)
35−import Test.Spec.Runner (runSpec)
26+
27+import Database.IndexedDB.Core
28+import Database.IndexedDB.IDBKey
29+import Database.IndexedDB.IDBCursor as IDBCursor
30+import Database.IndexedDB.IDBDatabase as IDBDatabase
31+import Database.IndexedDB.IDBFactory as IDBFactory
32+import Database.IndexedDB.IDBIndex as IDBIndex
33+import Database.IndexedDB.IDBKeyRange as IDBKeyRange
34+import Database.IndexedDB.IDBObjectStore as IDBObjectStore
35+import Database.IndexedDB.IDBTransaction as IDBTransaction
36+
36
37
37infixr 7 Tuple as :+:
38infixr 7 Tuple as :+:
38
39
39−launchAff' :: forall a. Aff a -> Effect Unit
40+launchAff' :: forall a e. Aff e a -> Eff e Unit
40launchAff' =
41launchAff' =
41− launchAff_ <<< void
42+ launchAff_
42−
43+
44+
43−modifyAVar :: forall a. (a -> a) -> AVar a -> Aff Unit
45+modifyVar :: forall eff a. (a -> a) -> AVar a -> Aff (avar :: AVAR | eff) Unit
44−modifyAVar fn v = do
46+modifyVar fn v = do
45− val <- AVar.take v
47+ val <- takeVar v
46− AVar.put (fn val) v
48+ putVar (fn val) v
47−
49+
48−main :: Effect Unit
50+
49−main = do
51+-- main :: forall eff. Eff (now :: NOW, mocha :: MOCHA, idb :: IDB, exception :: EXCEPTION, avar :: AVAR | eff) Unit
50− launchAff_ $ runSpec [ consoleReporter ] $ do
52+main = runMocha do
51− describe "IDBFactory" do
53+ describe "IDBFactory" do
52− let
54+ let
53 tearDown name version db = do
55 tearDown name version db = do
54 IDBDatabase.close db
56 IDBDatabase.close db
55 version' <- IDBFactory.deleteDatabase name
57 version' <- IDBFactory.deleteDatabase name
56− liftEffect $ log $ show version'
57 version' `shouldEqual` version
58 version' `shouldEqual` version
58
59
59− it "open default" do
60+ it "open default" do
60− let
61− name = "db-default"
61+ let name = "db-default"
62 version = 1
62 version = 1
63− db <- IDBFactory.open name Nothing
63+ db <- IDBFactory.open name Nothing
64− { onUpgradeNeeded: Nothing
64+ { onUpgradeNeeded : Nothing
65− , onBlocked: Nothing
65+ , onBlocked : Nothing
66− }
66+ }
67− IDBDatabase.name db `shouldEqual` name
67+ IDBDatabase.name db `shouldEqual` name
68− tearDown name version db
68+ tearDown name version db
69
69
70− it "open specific version" do
71− let
72− name = "db-specific"
73− version = 14
74− db <- IDBFactory.open name (Just version)
75− { onUpgradeNeeded: Nothing
76− , onBlocked: Nothing
77− }
78− IDBDatabase.name db `shouldEqual` name
79− tearDown name version db
80
70
81− it "open specific version -> close -> open latest" do
71+ it "open specific version" do
82− let
83− name = "db-latest"
72+ let name = "db-specific"
84 version = 14
73 version = 14
85− db01 <- IDBFactory.open name (Just version)
74+ db <- IDBFactory.open name (Just version)
86− { onUpgradeNeeded: Nothing
75+ { onUpgradeNeeded : Nothing
87− , onBlocked: Nothing
76+ , onBlocked : Nothing
88− }
77+ }
89− IDBDatabase.name db01 `shouldEqual` name
78+ IDBDatabase.name db `shouldEqual` name
90− IDBDatabase.close db01
91− db02 <- IDBFactory.open name Nothing
92− { onUpgradeNeeded: Nothing
93− , onBlocked: Nothing
94− }
95− tearDown name version db02
79+ tearDown name version db
96
80
81+
82+ it "open specific version -> close -> open latest" do
83+ let name = "db-latest"
84+ version = 14
85+ db01 <- IDBFactory.open name (Just version)
86+ { onUpgradeNeeded : Nothing
87+ , onBlocked : Nothing
88+ }
89+ IDBDatabase.name db01 `shouldEqual` name
90+ IDBDatabase.close db01
91+ db02 <- IDBFactory.open name Nothing
92+ { onUpgradeNeeded : Nothing
93+ , onBlocked : Nothing
94+ }
95+ tearDown name version db02
96+
97− it "open + onUpgradeNeed" do
97+ it "open + onUpgradeNeed" do
98− let
99− name = "db-upgrade-needed"
98+ let name = "db-upgrade-needed"
100 version = 1
99 version = 1
101 callback (Tuple varName varVersion) db _ { oldVersion } = do
100 callback (Tuple varName varVersion) db _ { oldVersion } = do
102− _ <- launchAff $ modifyAVar (const $ IDBDatabase.name db) varName
101+ _ <- launchAff $ modifyVar (const $ IDBDatabase.name db) varName
103− _ <- launchAff $ modifyAVar (const $ oldVersion) varVersion
102+ _ <- launchAff $ modifyVar (const $ oldVersion) varVersion
104 pure unit
103 pure unit
105− varName <- AVar.new "-"
104+ varName <- makeVar "-"
106− varVersion <- AVar.new (-1)
105+ varVersion <- makeVar (-1)
107− db <- IDBFactory.open name Nothing
106+ db <- IDBFactory.open name Nothing
108− { onUpgradeNeeded: Just (callback (Tuple varName varVersion))
107+ { onUpgradeNeeded : Just (callback (Tuple varName varVersion))
109− , onBlocked: Nothing
108+ , onBlocked : Nothing
110− }
109+ }
111− name' <- AVar.read varName
110+ name' <- readVar varName
112− version' <- AVar.read varVersion
111+ version' <- readVar varVersion
113− name' `shouldEqual` name
112+ name' `shouldEqual` name
114− version' `shouldEqual` 0
113+ version' `shouldEqual` 0
115− tearDown name version db
114+ tearDown name version db
116−
115+
117− it "open + onBlocked" do
116+ it "open + onBlocked" do
118− let
119− name = "db-blocked"
117+ let name = "db-blocked"
120 version = 14
118 version = 14
121 callback var = do
119 callback var = do
122− _ <- launchAff $ modifyAVar (const $ "db-blocked") var
120+ _ <- launchAff $ modifyVar (const $ "db-blocked") var
123 pure unit
121 pure unit
124
122
125− var <- AVar.new "-"
123+ var <- makeVar "-"
126− db01 <- IDBFactory.open name Nothing
124+ db01 <- IDBFactory.open name Nothing
127− { onUpgradeNeeded: Nothing
125+ { onUpgradeNeeded : Nothing
128− , onBlocked: Nothing
126+ , onBlocked : Nothing
129− }
127+ }
130− _ <- forkAff do
128+ _ <- forkAff do
131− delay (Milliseconds 100.0)
129+ delay (Milliseconds 100.0)
132− IDBDatabase.close db01
130+ IDBDatabase.close db01
133
131
134− db02 <- IDBFactory.open name (Just version)
132+ db02 <- IDBFactory.open name (Just version)
135− { onUpgradeNeeded: Nothing
133+ { onUpgradeNeeded : Nothing
136− , onBlocked: Just (callback var)
134+ , onBlocked : Just (callback var)
137− }
135+ }
138− name' <- AVar.read var
136+ name' <- readVar var
139− name' `shouldEqual` name
137+ name' `shouldEqual` name
140− tearDown name version db02
138+ tearDown name version db02
141−
139+
142− describe "IDBKeyRange" do
140+ describe "IDBKeyRange" do
143− it "only(int)" do
141+ it "only(int)" do
144− let
145− key = 14
142+ let key = 14
146 range = IDBKeyRange.only key
143 range = IDBKeyRange.only key
147− IDBKeyRange.includes range (toKey key) `shouldEqual` true
144+ IDBKeyRange.includes range (toKey key) `shouldEqual` true
148
145
149− it "only(string)" do
146+ it "only(string)" do
150− let
151− key = "patate"
147+ let key = "patate"
152 range = IDBKeyRange.only key
148 range = IDBKeyRange.only key
153− IDBKeyRange.includes range (toKey key) `shouldEqual` true
149+ IDBKeyRange.includes range (toKey key) `shouldEqual` true
154
150
155− it "only(float)" do
151+ it "only(float)" do
156− let
157− key = 14.42
152+ let key = 14.42
158 range = IDBKeyRange.only key
153 range = IDBKeyRange.only key
159− IDBKeyRange.includes range (toKey key) `shouldEqual` true
154+ IDBKeyRange.includes range (toKey key) `shouldEqual` true
160
155
161− it "only(date)" do
156+ it "only(date)" do
162− let
163− mkey = DateTime
157+ let mkey = DateTime
164 <$> (Date.canonicalDate <$> toEnum 2017 <*> toEnum 6 <*> toEnum 23)
158 <$> (Date.canonicalDate <$> toEnum 2017 <*> toEnum 6 <*> toEnum 23)
165 <*> (Time <$> toEnum 17 <*> toEnum 59 <*> toEnum 34 <*> toEnum 42)
159 <*> (Time <$> toEnum 17 <*> toEnum 59 <*> toEnum 34 <*> toEnum 42)
166
160
167− case mkey of
161+ case mkey of
168− Nothing ->
162+ Nothing ->
169− fail "unable to create datetime"
163+ fail "unable to create datetime"
170− Just key -> do
164+ Just key -> do
171− let range = IDBKeyRange.only key
165+ let range = IDBKeyRange.only key
172− IDBKeyRange.includes range (toKey key) `shouldEqual` true
166+ IDBKeyRange.includes range (toKey key) `shouldEqual` true
173
167
174− it "only([int])" do
168+ it "only([int])" do
175− let
176− key = [ 14, 42 ]
169+ let key = [14, 42]
177 range = IDBKeyRange.only key
170 range = IDBKeyRange.only key
178− IDBKeyRange.includes range (toKey key) `shouldEqual` true
171+ IDBKeyRange.includes range (toKey key) `shouldEqual` true
179
172
180− it "only([string])" do
173+ it "only([string])" do
181− let
182− key = [ "patate", "autruche" ]
174+ let key = ["patate", "autruche"]
183 range = IDBKeyRange.only key
175 range = IDBKeyRange.only key
184− IDBKeyRange.includes range (toKey key) `shouldEqual` true
176+ IDBKeyRange.includes range (toKey key) `shouldEqual` true
185
177
186− it "lowerBound(14, open)" do
178+ it "lowerBound(14, open)" do
187− let
188− key = 14
179+ let key = 14
189− open = true
180+ open = true
190 range = IDBKeyRange.lowerBound key open
181 range = IDBKeyRange.lowerBound key open
191− IDBKeyRange.includes range (toKey (key + 1)) `shouldEqual` true
182+ IDBKeyRange.includes range (toKey (key + 1)) `shouldEqual` true
192− IDBKeyRange.includes range (toKey key) `shouldEqual` (not open)
183+ IDBKeyRange.includes range (toKey key) `shouldEqual` (not open)
193− IDBKeyRange.includes range (toKey (key - 1)) `shouldEqual` false
184+ IDBKeyRange.includes range (toKey (key - 1)) `shouldEqual` false
194−
185+
195− it "lowerBound(14, close)" do
186+ it "lowerBound(14, close)" do
196− let
197− key = 14
187+ let key = 14
198− open = false
188+ open = false
199 range = IDBKeyRange.lowerBound key open
189 range = IDBKeyRange.lowerBound key open
200− IDBKeyRange.includes range (toKey (key + 1)) `shouldEqual` true
190+ IDBKeyRange.includes range (toKey (key + 1)) `shouldEqual` true
201− IDBKeyRange.includes range (toKey key) `shouldEqual` (not open)
191+ IDBKeyRange.includes range (toKey key) `shouldEqual` (not open)
202− IDBKeyRange.includes range (toKey (key - 1)) `shouldEqual` false
192+ IDBKeyRange.includes range (toKey (key - 1)) `shouldEqual` false
203−
193+
204− it "upperBound(14, open)" do
194+ it "upperBound(14, open)" do
205− let
206− key = 14
195+ let key = 14
207− open = true
196+ open = true
208 range = IDBKeyRange.upperBound key open
197 range = IDBKeyRange.upperBound key open
209− IDBKeyRange.includes range (toKey (key + 1)) `shouldEqual` false
198+ IDBKeyRange.includes range (toKey (key + 1)) `shouldEqual` false
210− IDBKeyRange.includes range (toKey key) `shouldEqual` (not open)
199+ IDBKeyRange.includes range (toKey key) `shouldEqual` (not open)
211− IDBKeyRange.includes range (toKey (key - 1)) `shouldEqual` true
200+ IDBKeyRange.includes range (toKey (key - 1)) `shouldEqual` true
212−
201+
213− it "upperBound(14, close)" do
202+ it "upperBound(14, close)" do
214− let
215− key = 14
203+ let key = 14
216− open = false
204+ open = false
217 range = IDBKeyRange.upperBound key open
205 range = IDBKeyRange.upperBound key open
218− IDBKeyRange.includes range (toKey (key + 1)) `shouldEqual` false
206+ IDBKeyRange.includes range (toKey (key + 1)) `shouldEqual` false
219− IDBKeyRange.includes range (toKey key) `shouldEqual` (not open)
207+ IDBKeyRange.includes range (toKey key) `shouldEqual` (not open)
220− IDBKeyRange.includes range (toKey (key - 1)) `shouldEqual` true
208+ IDBKeyRange.includes range (toKey (key - 1)) `shouldEqual` true
221−
209+
222− it "bound(42, 14, open, open) => Nothing" do
210+ it "bound(42, 14, open, open) => Nothing" do
223− let
224− lower = 42
211+ let lower = 42
225− upper = 14
212+ upper = 14
226 lowerOpen = true
213 lowerOpen = true
227 upperOpen = true
214 upperOpen = true
228− mrange = IDBKeyRange.bound { lower, upper, lowerOpen, upperOpen }
215+ mrange = IDBKeyRange.bound { lower, upper, lowerOpen, upperOpen }
229− isNothing mrange `shouldEqual` true
216+ isNothing mrange `shouldEqual` true
230
217
231− it "bound(14, 42, open, open)" do
218+ it "bound(14, 42, open, open)" do
232− let
233− lower = 14
219+ let lower = 14
234− upper = 42
220+ upper = 42
235 lowerOpen = true
221 lowerOpen = true
236 upperOpen = true
222 upperOpen = true
237− mrange = IDBKeyRange.bound { lower, upper, lowerOpen, upperOpen }
223+ mrange = IDBKeyRange.bound { lower, upper, lowerOpen, upperOpen }
238− case mrange of
224+ case mrange of
239− Nothing ->
225+ Nothing ->
240− fail "invalid range provided"
226+ fail "invalid range provided"
241− Just range -> do
227+ Just range -> do
242− IDBKeyRange.includes range (toKey (lower + 1)) `shouldEqual` true
228+ IDBKeyRange.includes range (toKey (lower + 1)) `shouldEqual` true
243− IDBKeyRange.includes range (toKey (upper - 1)) `shouldEqual` true
229+ IDBKeyRange.includes range (toKey (upper - 1)) `shouldEqual` true
244− IDBKeyRange.includes range (toKey (lower - 1)) `shouldEqual` false
230+ IDBKeyRange.includes range (toKey (lower - 1)) `shouldEqual` false
245− IDBKeyRange.includes range (toKey (upper + 1)) `shouldEqual` false
231+ IDBKeyRange.includes range (toKey (upper + 1)) `shouldEqual` false
246− IDBKeyRange.includes range (toKey lower) `shouldEqual` (not lowerOpen)
232+ IDBKeyRange.includes range (toKey lower) `shouldEqual` (not lowerOpen)
247− IDBKeyRange.includes range (toKey upper) `shouldEqual` (not upperOpen)
233+ IDBKeyRange.includes range (toKey upper) `shouldEqual` (not upperOpen)
248−
234+
249− it "bound(14, 42, open, close)" do
235+ it "bound(14, 42, open, close)" do
250− let
251− lower = 14
236+ let lower = 14
252− upper = 42
237+ upper = 42
253 lowerOpen = true
238 lowerOpen = true
254 upperOpen = false
239 upperOpen = false
255− mrange = IDBKeyRange.bound { lower, upper, lowerOpen, upperOpen }
240+ mrange = IDBKeyRange.bound { lower, upper, lowerOpen, upperOpen }
256− case mrange of
241+ case mrange of
257− Nothing ->
242+ Nothing ->
258− fail "invalid range provided"
243+ fail "invalid range provided"
259− Just range -> do
244+ Just range -> do
260− IDBKeyRange.includes range (toKey (lower + 1)) `shouldEqual` true
245+ IDBKeyRange.includes range (toKey (lower + 1)) `shouldEqual` true
261− IDBKeyRange.includes range (toKey (upper - 1)) `shouldEqual` true
246+ IDBKeyRange.includes range (toKey (upper - 1)) `shouldEqual` true
262− IDBKeyRange.includes range (toKey (lower - 1)) `shouldEqual` false
247+ IDBKeyRange.includes range (toKey (lower - 1)) `shouldEqual` false
263− IDBKeyRange.includes range (toKey (upper + 1)) `shouldEqual` false
248+ IDBKeyRange.includes range (toKey (upper + 1)) `shouldEqual` false
264− IDBKeyRange.includes range (toKey lower) `shouldEqual` (not lowerOpen)
249+ IDBKeyRange.includes range (toKey lower) `shouldEqual` (not lowerOpen)
265− IDBKeyRange.includes range (toKey upper) `shouldEqual` (not upperOpen)
250+ IDBKeyRange.includes range (toKey upper) `shouldEqual` (not upperOpen)
266−
251+
267− it "bound(14, 42, close, open)" do
252+ it "bound(14, 42, close, open)" do
268− let
269− lower = 14
253+ let lower = 14
270− upper = 42
254+ upper = 42
271 lowerOpen = false
255 lowerOpen = false
272 upperOpen = true
256 upperOpen = true
273− mrange = IDBKeyRange.bound { lower, upper, lowerOpen, upperOpen }
257+ mrange = IDBKeyRange.bound { lower, upper, lowerOpen, upperOpen }
274− case mrange of
258+ case mrange of
275− Nothing ->
259+ Nothing ->
276− fail "invalid range provided"
260+ fail "invalid range provided"
277− Just range -> do
261+ Just range -> do
278− IDBKeyRange.includes range (toKey (lower + 1)) `shouldEqual` true
262+ IDBKeyRange.includes range (toKey (lower + 1)) `shouldEqual` true
279− IDBKeyRange.includes range (toKey (upper - 1)) `shouldEqual` true
263+ IDBKeyRange.includes range (toKey (upper - 1)) `shouldEqual` true
280− IDBKeyRange.includes range (toKey (lower - 1)) `shouldEqual` false
264+ IDBKeyRange.includes range (toKey (lower - 1)) `shouldEqual` false
281− IDBKeyRange.includes range (toKey (upper + 1)) `shouldEqual` false
265+ IDBKeyRange.includes range (toKey (upper + 1)) `shouldEqual` false
282− IDBKeyRange.includes range (toKey lower) `shouldEqual` (not lowerOpen)
266+ IDBKeyRange.includes range (toKey lower) `shouldEqual` (not lowerOpen)
283− IDBKeyRange.includes range (toKey upper) `shouldEqual` (not upperOpen)
267+ IDBKeyRange.includes range (toKey upper) `shouldEqual` (not upperOpen)
284−
268+
285− it "bound(14, 42, close, close)" do
269+ it "bound(14, 42, close, close)" do
286− let
287− lower = 14
270+ let lower = 14
288− upper = 42
271+ upper = 42
289 lowerOpen = false
272 lowerOpen = false
290 upperOpen = false
273 upperOpen = false
291− mrange = IDBKeyRange.bound { lower, upper, lowerOpen, upperOpen }
274+ mrange = IDBKeyRange.bound { lower, upper, lowerOpen, upperOpen }
292− case mrange of
275+ case mrange of
293− Nothing ->
276+ Nothing ->
294− fail "invalid range provided"
277+ fail "invalid range provided"
295− Just range -> do
278+ Just range -> do
296− IDBKeyRange.includes range (toKey (lower + 1)) `shouldEqual` true
279+ IDBKeyRange.includes range (toKey (lower + 1)) `shouldEqual` true
297− IDBKeyRange.includes range (toKey (upper - 1)) `shouldEqual` true
280+ IDBKeyRange.includes range (toKey (upper - 1)) `shouldEqual` true
298− IDBKeyRange.includes range (toKey (lower - 1)) `shouldEqual` false
281+ IDBKeyRange.includes range (toKey (lower - 1)) `shouldEqual` false
299− IDBKeyRange.includes range (toKey (upper + 1)) `shouldEqual` false
282+ IDBKeyRange.includes range (toKey (upper + 1)) `shouldEqual` false
300− IDBKeyRange.includes range (toKey lower) `shouldEqual` (not lowerOpen)
283+ IDBKeyRange.includes range (toKey lower) `shouldEqual` (not lowerOpen)
301− IDBKeyRange.includes range (toKey upper) `shouldEqual` (not upperOpen)
284+ IDBKeyRange.includes range (toKey upper) `shouldEqual` (not upperOpen)
302−
285+
303− it "can access attributes of a range" do
286+ it "can access attributes of a range" do
304− let range = IDBKeyRange.lowerBound 14 false
287+ let range = IDBKeyRange.lowerBound 14 false
305− IDBKeyRange.lower range `shouldEqual` (Just $ toKey 14)
288+ IDBKeyRange.lower range `shouldEqual` (Just $ toKey 14)
306− IDBKeyRange.upper range `shouldEqual` none
289+ IDBKeyRange.upper range `shouldEqual` none
307− IDBKeyRange.lowerOpen range `shouldEqual` false
290+ IDBKeyRange.lowerOpen range `shouldEqual` false
308− IDBKeyRange.upperOpen range `shouldEqual` true
291+ IDBKeyRange.upperOpen range `shouldEqual` true
309−
292+
310− describe "IDBDatabase" do
293+ describe "IDBDatabase" do
311− let
294+ let
312 tearDown db = do
295 tearDown db = do
313 IDBDatabase.close db
296 IDBDatabase.close db
314 _ <- IDBFactory.deleteDatabase (IDBDatabase.name db)
297 _ <- IDBFactory.deleteDatabase (IDBDatabase.name db)
315 pure unit
298 pure unit
316
299
317 setup storeParams = do
300 setup storeParams = do
318− let
319− onUpgradeNeeded var db _ _ = launchAff' do
301+ let onUpgradeNeeded var db _ _ = launchAff' do
320− store <- IDBDatabase.createObjectStore db "store" storeParams
302+ store <- IDBDatabase.createObjectStore db "store" storeParams
321− _ <- AVar.put { db, store } var
303+ _ <- putVar { db, store } var
322− pure unit
304+ pure unit
323−
305+
324− var <- AVar.empty
306+ var <- makeEmptyVar
325− _ <- IDBFactory.open "db" Nothing
307+ db <- IDBFactory.open "db" Nothing
326− { onUpgradeNeeded: Just (onUpgradeNeeded var)
308+ { onUpgradeNeeded : Just (onUpgradeNeeded var)
327− , onBlocked: Nothing
309+ , onBlocked : Nothing
328 }
310 }
329
311
330− AVar.take var
312+ takeVar var
331−
313+
332− it "createObjectStore (keyPath: [], autoIncrement: true)" do
314+ it "createObjectStore (keyPath: [], autoIncrement: true)" do
333− { db, store } <- setup { keyPath: [], autoIncrement: true }
315+ { db, store } <- setup { keyPath: [], autoIncrement: true }
334− IDBObjectStore.name store `shouldEqual` "store"
316+ IDBObjectStore.name store `shouldEqual` "store"
335− IDBObjectStore.keyPath store `shouldEqual` []
317+ IDBObjectStore.keyPath store `shouldEqual` []
336− IDBObjectStore.autoIncrement store `shouldEqual` true
318+ IDBObjectStore.autoIncrement store `shouldEqual` true
337− IDBObjectStore.indexNames store `shouldEqual` []
319+ IDBObjectStore.indexNames store `shouldEqual` []
338− tearDown db
320+ tearDown db
339−
321+
340− it "createObjectStore (keyPath: [\"patate\"], autoIncrement: true)" do
322+ it "createObjectStore (keyPath: [\"patate\"], autoIncrement: true)" do
341− { db, store } <- setup { keyPath: [ "patate" ], autoIncrement: true }
323+ { db, store } <- setup { keyPath: ["patate"], autoIncrement: true }
342− IDBObjectStore.name store `shouldEqual` "store"
324+ IDBObjectStore.name store `shouldEqual` "store"
343− IDBObjectStore.keyPath store `shouldEqual` [ "patate" ]
325+ IDBObjectStore.keyPath store `shouldEqual` ["patate"]
344− IDBObjectStore.autoIncrement store `shouldEqual` true
326+ IDBObjectStore.autoIncrement store `shouldEqual` true
345− IDBObjectStore.indexNames store `shouldEqual` []
327+ IDBObjectStore.indexNames store `shouldEqual` []
346− tearDown db
328+ tearDown db
347−
329+
348− it "createObjectStore (keyPath: [\"a\", \"b\"], autoIncrement: false)" do
330+ it "createObjectStore (keyPath: [\"a\", \"b\"], autoIncrement: false)" do
349− { db, store } <- setup { keyPath: [ "patate", "autruche" ], autoIncrement: false }
331+ { db, store } <- setup { keyPath: ["patate", "autruche"], autoIncrement: false }
350− IDBObjectStore.name store `shouldEqual` "store"
332+ IDBObjectStore.name store `shouldEqual` "store"
351− IDBObjectStore.keyPath store `shouldEqual` [ "patate", "autruche" ]
333+ IDBObjectStore.keyPath store `shouldEqual` ["patate", "autruche"]
352− IDBObjectStore.autoIncrement store `shouldEqual` false
334+ IDBObjectStore.autoIncrement store `shouldEqual` false
353− IDBObjectStore.indexNames store `shouldEqual` []
335+ IDBObjectStore.indexNames store `shouldEqual` []
354− tearDown db
336+ tearDown db
355−
337+
356− it "deleteObjectStore" do
338+ it "deleteObjectStore" do
357− let
358− onUpgradeNeeded var db _ _ = launchAff' do
339+ let onUpgradeNeeded var db _ _ = launchAff' do
359 _ <- IDBDatabase.deleteObjectStore db "store"
340 _ <- IDBDatabase.deleteObjectStore db "store"
360− AVar.put true var
341+ putVar true var
361−
362− var <- AVar.empty
363− { db } <- setup IDBDatabase.defaultParameters
364− IDBDatabase.close db
365− db' <- IDBFactory.open "db" (Just 999)
366− { onUpgradeNeeded: Just (onUpgradeNeeded var)
367− , onBlocked: Nothing
368− }
369− deleted <- AVar.take var
370− deleted `shouldEqual` true
371− tearDown db'
372
342
343+ var <- makeEmptyVar
344+ { db, store } <- setup IDBDatabase.defaultParameters
345+ IDBDatabase.close db
346+ db' <- IDBFactory.open "db" (Just 999) { onUpgradeNeeded : Just (onUpgradeNeeded var)
347+ , onBlocked : Nothing
348+ }
349+ deleted <- takeVar var
350+ deleted `shouldEqual` true
351+ tearDown db'
352+
353+
373− describe "IDBObjectStore" do
354+ describe "IDBObjectStore" do
374− let
355+ let
375 tearDown db = do
356 tearDown db = do
376 IDBDatabase.close db
357 IDBDatabase.close db
377 _ <- IDBFactory.deleteDatabase (IDBDatabase.name db)
358 _ <- IDBFactory.deleteDatabase (IDBDatabase.name db)
378 pure unit
359 pure unit
379
360
380 setup { storeParams, onUpgradeNeeded } = do
361 setup { storeParams, onUpgradeNeeded } = do
381− let
382− onUpgradeNeeded' var db _ _ = launchAff' do
362+ let onUpgradeNeeded' var db _ _ = launchAff' do
383− store <- IDBDatabase.createObjectStore db "store" storeParams
363+ store <- IDBDatabase.createObjectStore db "store" storeParams
384− liftEffect $ maybe (pure unit) identity (onUpgradeNeeded <*> pure db <*> pure store)
364+ liftEff $ maybe (pure unit) id (onUpgradeNeeded <*> pure db <*> pure store)
385− AVar.put { db, store } var
365+ putVar { db, store } var
386−
366+
387− var <- AVar.empty
367+ var <- makeEmptyVar
388− _ <- IDBFactory.open "db" Nothing
368+ db <- IDBFactory.open "db" Nothing
389− { onUpgradeNeeded: Just (onUpgradeNeeded' var)
369+ { onUpgradeNeeded : Just (onUpgradeNeeded' var)
390− , onBlocked: Nothing
370+ , onBlocked : Nothing
391 }
371 }
392
372
393− AVar.take var
373+ takeVar var
394−
374+
395− it "add()" do
375+ it "add()" do
396− date <- liftEffect $ toDateTime <$> now
376+ date <- liftEff $ toDateTime <$> now
397− { db } <- setup
377+ { db } <- setup
398− { storeParams: { autoIncrement: true, keyPath: [] }
378+ { storeParams: { autoIncrement: true, keyPath: [] }
399− , onUpgradeNeeded: Just $ \_ store -> launchAff' do
379+ , onUpgradeNeeded: Just $ \_ store -> launchAff' do
400− -- no key
380+ -- no key
401− key <- IDBObjectStore.add store "patate" none
381+ key <- IDBObjectStore.add store "patate" none
402− (toKey 1) `shouldEqual` key
382+ (toKey 1) `shouldEqual` key
403−
383+
404− -- int key
384+ -- int key
405− key' <- IDBObjectStore.add store "patate" (Just 14)
385+ key' <- IDBObjectStore.add store "patate" (Just 14)
406− (toKey 14) `shouldEqual` key'
386+ (toKey 14) `shouldEqual` key'
407−
387+
408− -- number key
388+ -- number key
409− key'' <- IDBObjectStore.add store "patate" (Just 14.42)
389+ key'' <- IDBObjectStore.add store "patate" (Just 14.42)
410− (toKey 14.42) `shouldEqual` key''
390+ (toKey 14.42) `shouldEqual` key''
411−
391+
412− -- string key
392+ -- string key
413− key''' <- IDBObjectStore.add store "patate" (Just "key")
393+ key''' <- IDBObjectStore.add store "patate" (Just "key")
414− (toKey "key") `shouldEqual` key'''
394+ (toKey "key") `shouldEqual` key'''
415−
395+
416− -- date key
396+ -- date key
417− key'''' <- IDBObjectStore.add store "patate" (Just date)
397+ key'''' <- IDBObjectStore.add store "patate" (Just date)
418− (toKey date) `shouldEqual` key''''
398+ (toKey date) `shouldEqual` key''''
419−
399+
420− -- array key
400+ -- array key
421− key''''' <- IDBObjectStore.add store "patate" (Just $ toKey [ 14, 42 ])
401+ key''''' <- IDBObjectStore.add store "patate" (Just $ toKey [14, 42])
422− (toKey [ 14, 42 ]) `shouldEqual` key'''''
402+ (toKey [14, 42]) `shouldEqual` key'''''
423− }
403+ }
424− tearDown db
404+ tearDown db
425−
405+
426− it "clear()" do
406+ it "clear()" do
427− { db } <- setup
407+ { db } <- setup
428− { storeParams: IDBDatabase.defaultParameters
408+ { storeParams: IDBDatabase.defaultParameters
429− , onUpgradeNeeded: Just $ \_ store -> launchAff' do
409+ , onUpgradeNeeded: Just $ \_ store -> launchAff' do
430− key <- IDBObjectStore.add store "patate" (Just 14)
410+ key <- IDBObjectStore.add store "patate" (Just 14)
431− _ <- IDBObjectStore.clear store
411+ _ <- IDBObjectStore.clear store
432− val <- IDBObjectStore.get store (IDBKeyRange.only key)
412+ val <- IDBObjectStore.get store (IDBKeyRange.only key)
433− val `shouldEqual` (Nothing :: Maybe String)
413+ val `shouldEqual` (Nothing :: Maybe String)
434− }
414+ }
435− tearDown db
415+ tearDown db
436−
416+
437− it "count()" do
417+ it "count()" do
438− { db } <- setup
418+ { db } <- setup
439− { storeParams: IDBDatabase.defaultParameters
419+ { storeParams: IDBDatabase.defaultParameters
440− , onUpgradeNeeded: Just $ \_ store -> launchAff' do
420+ , onUpgradeNeeded: Just $ \_ store -> launchAff' do
441− _ <- IDBObjectStore.add store "patate" (Just 14)
421+ _ <- IDBObjectStore.add store "patate" (Just 14)
442− _ <- IDBObjectStore.add store "autruche" (Just 42)
422+ _ <- IDBObjectStore.add store "autruche" (Just 42)
443− n <- IDBObjectStore.count store Nothing
423+ n <- IDBObjectStore.count store Nothing
444− n `shouldEqual` 2
424+ n `shouldEqual` 2
445− }
425+ }
446− tearDown db
426+ tearDown db
447−
427+
448− it "getKey()" do
428+ it "getKey()" do
449− { db } <- setup
429+ { db } <- setup
450− { storeParams: IDBDatabase.defaultParameters
430+ { storeParams: IDBDatabase.defaultParameters
451− , onUpgradeNeeded: Just $ \_ store -> launchAff' do
431+ , onUpgradeNeeded: Just $ \_ store -> launchAff' do
452− key <- IDBObjectStore.add store "patate" (Just 14)
432+ key <- IDBObjectStore.add store "patate" (Just 14)
453− mkey <- IDBObjectStore.getKey store (IDBKeyRange.only 14)
433+ mkey <- IDBObjectStore.getKey store (IDBKeyRange.only 14)
454− mkey `shouldEqual` (Just key)
434+ mkey `shouldEqual` (Just key)
455−
435+
456− mkey' <- IDBObjectStore.getKey store (IDBKeyRange.only 42)
436+ mkey' <- IDBObjectStore.getKey store (IDBKeyRange.only 42)
457− mkey' `shouldEqual` none
437+ mkey' `shouldEqual` none
458− }
459− tearDown db
460−
461− it "getAllKeys()" do
462− { db } <- setup
463− { storeParams: IDBDatabase.defaultParameters
464− , onUpgradeNeeded: Just $ \_ store -> launchAff' do
465− key1 <- IDBObjectStore.add store "patate" (Just 14)
466− key2 <- IDBObjectStore.add store "autruche" (Just 42)
467− key3 <- IDBObjectStore.add store 14 (Just 1337)
468−
469− -- no bounds
470− keys <- IDBObjectStore.getAllKeys store Nothing Nothing
471− keys `shouldEqual` [ key1, key2, key3 ]
472−
473− -- lower bound
474− keys' <- IDBObjectStore.getAllKeys store (Just $ IDBKeyRange.lowerBound 14 true) Nothing
475− keys' `shouldEqual` [ key2, key3 ]
476−
477− -- upper bound
478− keys'' <- IDBObjectStore.getAllKeys store (Just $ IDBKeyRange.upperBound 42 false) Nothing
479− keys'' `shouldEqual` [ key1, key2 ]
480−
481− -- count
482− keys''' <- IDBObjectStore.getAllKeys store (Just $ IDBKeyRange.lowerBound 1 true) (Just 2)
483− keys''' `shouldEqual` [ key1, key2 ]
484 }
438 }
485− tearDown db
439+ tearDown db
486−
440+
441+ it "getAllKeys()" do
442+ { db } <- setup
443+ { storeParams: IDBDatabase.defaultParameters
444+ , onUpgradeNeeded: Just $ \_ store -> launchAff' do
445+ key1 <- IDBObjectStore.add store "patate" (Just 14)
446+ key2 <- IDBObjectStore.add store "autruche" (Just 42)
447+ key3 <- IDBObjectStore.add store 14 (Just 1337)
448+
449+ -- no bounds
450+ keys <- IDBObjectStore.getAllKeys store Nothing Nothing
451+ keys `shouldEqual` [key1, key2, key3]
452+
453+ -- lower bound
454+ keys' <- IDBObjectStore.getAllKeys store (Just $ IDBKeyRange.lowerBound 14 true) Nothing
455+ keys' `shouldEqual` [key2, key3]
456+
457+ -- upper bound
458+ keys'' <- IDBObjectStore.getAllKeys store (Just $ IDBKeyRange.upperBound 42 false) Nothing
459+ keys'' `shouldEqual` [key1, key2]
460+
461+ -- count
462+ keys''' <- IDBObjectStore.getAllKeys store (Just $ IDBKeyRange.lowerBound 1 true) (Just 2)
463+ keys''' `shouldEqual` [key1, key2]
464+ }
465+ tearDown db
466+
487− it "openCursor()" do
467+ it "openCursor()" do
488− let
468+ let cb =
489− cb =
490− { onSuccess: const $ pure unit
469+ { onSuccess : const $ pure unit
491− , onError: show >>> fail >>> launchAff'
470+ , onError : show >>> fail >>> launchAff'
492 , onComplete: pure unit
471 , onComplete: pure unit
493 }
472 }
494− { db } <- setup
473+ { db } <- setup
495− { storeParams: IDBDatabase.defaultParameters
474+ { storeParams: IDBDatabase.defaultParameters
496− , onUpgradeNeeded: Just $ \_ store -> launchAff' do
475+ , onUpgradeNeeded: Just $ \_ store -> launchAff' do
497− _ <- IDBObjectStore.openCursor store Nothing Next cb
476+ _ <- IDBObjectStore.openCursor store Nothing Next cb
498− _ <- IDBObjectStore.openCursor store Nothing NextUnique cb
477+ _ <- IDBObjectStore.openCursor store Nothing NextUnique cb
499− _ <- IDBObjectStore.openCursor store Nothing Prev cb
478+ _ <- IDBObjectStore.openCursor store Nothing Prev cb
500− _ <- IDBObjectStore.openCursor store Nothing PrevUnique cb
479+ _ <- IDBObjectStore.openCursor store Nothing PrevUnique cb
501− _ <- IDBObjectStore.openCursor store (Just $ IDBKeyRange.upperBound 1 true) Next cb
480+ _ <- IDBObjectStore.openCursor store (Just $ IDBKeyRange.upperBound 1 true) Next cb
502− pure unit
481+ pure unit
503− }
482+ }
504− tearDown db
483+ tearDown db
505
484
506− it "openKeyCursor()" do
485+ it "openKeyCursor()" do
507− let
486+ let cb =
508− cb =
509− { onSuccess: const $ pure unit
487+ { onSuccess : const $ pure unit
510− , onError: show >>> fail >>> launchAff'
488+ , onError : show >>> fail >>> launchAff'
511 , onComplete: pure unit
489 , onComplete: pure unit
512 }
490 }
513− { db } <- setup
491+ { db } <- setup
514− { storeParams: IDBDatabase.defaultParameters
492+ { storeParams: IDBDatabase.defaultParameters
515− , onUpgradeNeeded: Just $ \_ store -> launchAff' do
493+ , onUpgradeNeeded: Just $ \_ store -> launchAff' do
516− _ <- IDBObjectStore.openKeyCursor store Nothing Next cb
494+ _ <- IDBObjectStore.openKeyCursor store Nothing Next cb
517− _ <- IDBObjectStore.openKeyCursor store Nothing NextUnique cb
495+ _ <- IDBObjectStore.openKeyCursor store Nothing NextUnique cb
518− _ <- IDBObjectStore.openKeyCursor store Nothing Prev cb
496+ _ <- IDBObjectStore.openKeyCursor store Nothing Prev cb
519− _ <- IDBObjectStore.openKeyCursor store Nothing PrevUnique cb
497+ _ <- IDBObjectStore.openKeyCursor store Nothing PrevUnique cb
520− _ <- IDBObjectStore.openKeyCursor store (Just $ IDBKeyRange.lowerBound 1 true) Next cb
498+ _ <- IDBObjectStore.openKeyCursor store (Just $ IDBKeyRange.lowerBound 1 true) Next cb
521− pure unit
499+ pure unit
522− }
500+ }
523− tearDown db
501+ tearDown db
524
502
525− describe "IDBIndex" do
503+ describe "IDBIndex" do
526− let
504+ let
527 tearDown db = do
505 tearDown db = do
528 IDBDatabase.close db
506 IDBDatabase.close db
529 _ <- IDBFactory.deleteDatabase (IDBDatabase.name db)
507 _ <- IDBFactory.deleteDatabase (IDBDatabase.name db)
530 pure unit
508 pure unit
531
509
532− setup
533− :: forall value
510+ setup :: forall value e e'.
534− . { storeParams :: { keyPath :: Array String, autoIncrement :: Boolean }
511+ { storeParams :: { keyPath :: Array String, autoIncrement :: Boolean }
535− , indexParams :: { unique :: Boolean, multiEntry :: Boolean }
512+ , indexParams :: { unique :: Boolean, multiEntry :: Boolean }
536− , values :: Array (Tuple value (Maybe Key))
513+ , values :: Array (Tuple value (Maybe Key))
537− , keyPath :: Array String
514+ , keyPath :: Array String
538− , onUpgradeNeeded :: Maybe (Database -> Transaction -> Index -> Effect Unit)
515+ , onUpgradeNeeded :: Maybe (Database -> Transaction -> Index -> Eff (idb :: IDB, avar :: AVAR, exception :: EXCEPTION | e') Unit)
539− }
540− -> Aff { db :: Database, index :: Index, store :: ObjectStore }
516+ } -> Aff (idb :: IDB, avar :: AVAR | e) { db :: Database, index :: Index, store :: ObjectStore }
541 setup { storeParams, indexParams, values, keyPath, onUpgradeNeeded } = do
517 setup { storeParams, indexParams, values, keyPath, onUpgradeNeeded } = do
542− let
543− onUpgradeNeeded' var db tx _ = launchAff' do
518+ let onUpgradeNeeded' var db tx _ = launchAff' do
544− store <- IDBDatabase.createObjectStore db "store" storeParams
519+ store <- IDBDatabase.createObjectStore db "store" storeParams
545− _ <- traverse (uncurry (IDBObjectStore.add store)) values
520+ _ <- traverse (uncurry (IDBObjectStore.add store)) values
546− index <- IDBObjectStore.createIndex store "index" keyPath indexParams
521+ index <- IDBObjectStore.createIndex store "index" keyPath indexParams
547− liftEffect $ maybe (pure unit) identity (onUpgradeNeeded <*> pure db <*> pure tx <*> pure index)
522+ liftEff $ maybe (pure unit) id (onUpgradeNeeded <*> pure db <*> pure tx <*> pure index)
548− AVar.put { db, index, store } var
523+ putVar { db, index, store } var
549−
524+
550− var <- AVar.empty
525+ var <- makeEmptyVar
551− _ <- IDBFactory.open "db" Nothing
526+ db <- IDBFactory.open "db" Nothing
552− { onUpgradeNeeded: Just (onUpgradeNeeded' var)
527+ { onUpgradeNeeded : Just (onUpgradeNeeded' var)
553− , onBlocked: Nothing
528+ , onBlocked : Nothing
554 }
529 }
555− AVar.take var
530+ takeVar var
556−
531+
532+
557− it "returns an IDBIndex and the properties are set correctly" do
533+ it "returns an IDBIndex and the properties are set correctly" do
558− { db, index } <- setup
534+ { db, index } <- setup
559− { storeParams: IDBDatabase.defaultParameters
535+ { storeParams : IDBDatabase.defaultParameters
560− , indexParams: IDBObjectStore.defaultParameters
536+ , indexParams : IDBObjectStore.defaultParameters
561− , onUpgradeNeeded: Nothing
537+ , onUpgradeNeeded : Nothing
562− , keyPath: []
538+ , keyPath : []
563− , values: []
539+ , values : []
564− }
540+ }
565− IDBIndex.name index `shouldEqual` "index"
541+ IDBIndex.name index `shouldEqual` "index"
566− IDBIndex.keyPath index `shouldEqual` []
542+ IDBIndex.keyPath index `shouldEqual` []
567− IDBIndex.unique index `shouldEqual` IDBObjectStore.defaultParameters.unique
543+ IDBIndex.unique index `shouldEqual` IDBObjectStore.defaultParameters.unique
568− IDBIndex.multiEntry index `shouldEqual` IDBObjectStore.defaultParameters.multiEntry
544+ IDBIndex.multiEntry index `shouldEqual` IDBObjectStore.defaultParameters.multiEntry
569− tearDown db
545+ tearDown db
570−
546+
571− it "attempt to create an index that requires unique values on an object store already contains duplicates" do
547+ it "attempt to create an index that requires unique values on an object store already contains duplicates" do
572− let onAbort var = launchAff' (AVar.put true var)
548+ let onAbort var = launchAff' (putVar true var)
573− txVar <- AVar.empty
549+ txVar <- makeEmptyVar
574− dbVar <- AVar.empty
550+ dbVar <- makeEmptyVar
575− res <- attempt $ setup
551+ res <- attempt $ setup
576− { storeParams: IDBDatabase.defaultParameters
552+ { storeParams : IDBDatabase.defaultParameters
577− , indexParams:
553+ , indexParams : { unique : true
578− { unique: true
579− , multiEntry: false
554+ , multiEntry : false
580− }
555+ }
581− , keyPath: [ "indexedProperty" ]
556+ , keyPath : ["indexedProperty"]
582− , values:
583− [ { indexedProperty: "bar" } :+: (Just $ toKey 1)
557+ , values : [ { indexedProperty: "bar" } :+: (Just $ toKey 1)
584− , { indexedProperty: "bar" } :+: (Just $ toKey 2)
558+ , { indexedProperty: "bar" } :+: (Just $ toKey 2)
585− ]
559+ ]
586− , onUpgradeNeeded: Just $ \db tx _ -> launchAff' do
560+ , onUpgradeNeeded : Just $ \db tx _ -> launchAff' do
587− IDBTransaction.onAbort tx (onAbort txVar)
561+ IDBTransaction.onAbort tx (onAbort txVar)
588− IDBDatabase.onAbort db (onAbort dbVar)
562+ IDBDatabase.onAbort db (onAbort dbVar)
589− }
563+ }
590− case res of
564+ case res of
591− Right _ ->
565+ Right _ ->
592− fail "expected abort"
566+ fail "expected abort"
593− _ -> do
567+ _ -> do
594− shouldEqual true =<< AVar.take txVar
568+ shouldEqual true =<< takeVar txVar
595− shouldEqual true =<< AVar.take dbVar
569+ shouldEqual true =<< takeVar dbVar
596−
570+
571+
597− it "the index is usable right after being made" do
572+ it "the index is usable right after being made" do
598− { db } <- setup
573+ { db } <- setup
599− { storeParams:
574+ { storeParams : { keyPath : ["key"]
600− { keyPath: [ "key" ]
601− , autoIncrement: false
575+ , autoIncrement : false
602− }
576+ }
603− , indexParams: IDBObjectStore.defaultParameters
577+ , indexParams : IDBObjectStore.defaultParameters
604− , keyPath: [ "indexedProperty" ]
578+ , keyPath : ["indexedProperty"]
605− , values:
606− [ { key: "key1", indexedProperty: "indexed_1" } :+: Nothing
579+ , values : [ { key: "key1", indexedProperty: "indexed_1" } :+: Nothing
607− , { key: "key2", indexedProperty: "indexed_2" } :+: Nothing
580+ , { key: "key2", indexedProperty: "indexed_2" } :+: Nothing
608− , { key: "key3", indexedProperty: "indexed_3" } :+: Nothing
581+ , { key: "key3", indexedProperty: "indexed_3" } :+: Nothing
609− ]
582+ ]
610− , onUpgradeNeeded: Just $ \_ _ index -> launchAff' do
583+ , onUpgradeNeeded : Just $ \_ _ index -> launchAff' do
611− val <- IDBIndex.get index (IDBKeyRange.only "indexed_2")
584+ val <- IDBIndex.get index (IDBKeyRange.only "indexed_2")
612− ((\r -> r.key) <$> val) `shouldEqual` (Just $ toKey "key2")
585+ ((\r -> r.key) <$> val) `shouldEqual` (Just $ toKey "key2")
613− }
586+ }
614− tearDown db
587+ tearDown db
615−
588+
616− it "empty keyPath" do
589+ it "empty keyPath" do
617− { db } <- setup
590+ { db } <- setup
618− { storeParams: IDBDatabase.defaultParameters
591+ { storeParams : IDBDatabase.defaultParameters
619− , indexParams: IDBObjectStore.defaultParameters
592+ , indexParams : IDBObjectStore.defaultParameters
620− , keyPath: []
593+ , keyPath : []
621− , values:
622− [ "object_1" :+: (Just $ toKey 1)
594+ , values : [ "object_1" :+: (Just $ toKey 1)
623− , "object_2" :+: (Just $ toKey 2)
595+ , "object_2" :+: (Just $ toKey 2)
624− , "object_3" :+: (Just $ toKey 3)
596+ , "object_3" :+: (Just $ toKey 3)
625− ]
597+ ]
626− , onUpgradeNeeded: Just $ \_ _ index -> launchAff' do
598+ , onUpgradeNeeded : Just $ \_ _ index -> launchAff' do
627− val <- IDBIndex.get index (IDBKeyRange.only "object_3")
599+ val <- IDBIndex.get index (IDBKeyRange.only "object_3")
628− val `shouldEqual` (Just "object_3")
600+ val `shouldEqual` (Just "object_3")
629− }
601+ }
630− tearDown db
602+ tearDown db
631−
603+
632− it "index can be valid keys [date]" do
604+ it "index can be valid keys [date]" do
633− date <- liftEffect $ toDateTime <$> now
605+ date <- liftEff $ toDateTime <$> now
634− { db } <- setup
606+ { db } <- setup
635− { storeParams:
607+ { storeParams : { keyPath: ["key"]
636− { keyPath: [ "key" ]
637− , autoIncrement: false
608+ , autoIncrement: false
638− }
609+ }
639− , indexParams: IDBObjectStore.defaultParameters
610+ , indexParams : IDBObjectStore.defaultParameters
640− , keyPath: [ "i" ]
611+ , keyPath : ["i"]
641− , values:
642− [ { key: "date", i: (toKey date) } :+: Nothing
612+ , values : [ { key: "date", i: (toKey date) } :+: Nothing
643− ]
613+ ]
644− , onUpgradeNeeded: Just $ \_ _ index -> launchAff' do
614+ , onUpgradeNeeded : Just $ \_ _ index -> launchAff' do
645− val <- IDBIndex.get index (IDBKeyRange.only date)
615+ val <- IDBIndex.get index (IDBKeyRange.only date)
646− ((\r -> r.key) <$> val) `shouldEqual` (Just "date")
616+ ((\r -> r.key) <$> val) `shouldEqual` (Just "date")
647− }
617+ }
648− tearDown db
618+ tearDown db
649−
619+
650− it "index can be valid keys [num]" do
620+ it "index can be valid keys [num]" do
651− let num = 14
621+ let num = 14
652− { db } <- setup
622+ { db } <- setup
653− { storeParams:
623+ { storeParams : { keyPath: ["key"]
654− { keyPath: [ "key" ]
655− , autoIncrement: false
624+ , autoIncrement: false
656− }
625+ }
657− , indexParams: IDBObjectStore.defaultParameters
626+ , indexParams : IDBObjectStore.defaultParameters
658− , keyPath: [ "i" ]
627+ , keyPath : ["i"]
659− , values:
660− [ { key: "num", i: (toKey num) } :+: Nothing
628+ , values : [ { key: "num", i: (toKey num) } :+: Nothing
661− ]
629+ ]
662− , onUpgradeNeeded: Just $ \_ _ index -> launchAff' do
630+ , onUpgradeNeeded : Just $ \_ _ index -> launchAff' do
663− val <- IDBIndex.get index (IDBKeyRange.only num)
631+ val <- IDBIndex.get index (IDBKeyRange.only num)
664− ((\r -> r.key) <$> val) `shouldEqual` (Just "num")
632+ ((\r -> r.key) <$> val) `shouldEqual` (Just "num")
665− }
633+ }
666− tearDown db
634+ tearDown db
667−
635+
668− it "index can be valid keys [array]" do
636+ it "index can be valid keys [array]" do
669− let array = [ "patate", "autruche" ]
637+ let array = ["patate", "autruche"]
670− { db } <- setup
638+ { db } <- setup
671− { storeParams:
639+ { storeParams : { keyPath: ["key"]
672− { keyPath: [ "key" ]
673− , autoIncrement: false
640+ , autoIncrement: false
674− }
641+ }
675− , indexParams: IDBObjectStore.defaultParameters
642+ , indexParams : IDBObjectStore.defaultParameters
676− , keyPath: [ "i" ]
643+ , keyPath : ["i"]
677− , values:
678− [ { key: "array", i: (toKey array) } :+: Nothing
644+ , values : [ { key: "array", i: (toKey array) } :+: Nothing
679− ]
645+ ]
680− , onUpgradeNeeded: Just $ \_ _ index -> launchAff' do
646+ , onUpgradeNeeded : Just $ \_ _ index -> launchAff' do
681− val <- IDBIndex.get index (IDBKeyRange.only array)
647+ val <- IDBIndex.get index (IDBKeyRange.only array)
682− ((\r -> r.key) <$> val) `shouldEqual` (Just "array")
648+ ((\r -> r.key) <$> val) `shouldEqual` (Just "array")
683− }
649+ }
684− tearDown db
650+ tearDown db
685−
651+
686− it "openKeyCursor() - throw InvalidStateError on index deleted by aborted upgrade" do
652+ it "openKeyCursor() - throw InvalidStateError on index deleted by aborted upgrade" do
687− res <- attempt $ setup
653+ res <- attempt $ setup
688− { storeParams: { keyPath: [ "key" ], autoIncrement: false }
654+ { storeParams : { keyPath: ["key"], autoIncrement: false }
689− , indexParams: IDBObjectStore.defaultParameters
655+ , indexParams : IDBObjectStore.defaultParameters
690− , keyPath: [ "indexedProperty" ]
656+ , keyPath : ["indexedProperty"]
691− , values:
692− [ { key: 14, indexedProperty: "patate" } :+: Nothing
657+ , values : [ { key: 14, indexedProperty: "patate" } :+: Nothing
693− ]
658+ ]
694− , onUpgradeNeeded: Just $ \db tx index -> launchAff' do
659+ , onUpgradeNeeded : Just $ \db tx index -> launchAff' do
695− let
660+ let cb =
696− cb =
697− { onSuccess: const $ pure unit
661+ { onSuccess : const $ pure unit
698− , onError: show >>> fail >>> launchAff'
662+ , onError : show >>> fail >>> launchAff'
699 , onComplete: pure unit
663 , onComplete: pure unit
700 }
664 }
701− IDBTransaction.onAbort tx (pure unit)
665+ IDBTransaction.onAbort tx (pure unit)
702− IDBDatabase.onAbort db (pure unit)
666+ IDBDatabase.onAbort db (pure unit)
703− IDBTransaction.abort tx
667+ IDBTransaction.abort tx
704− cursor <- attempt $ IDBIndex.openKeyCursor index Nothing Next cb
668+ cursor <- attempt $ IDBIndex.openKeyCursor index Nothing Next cb
705− case cursor of
669+ case cursor of
706− Right _ -> fail "expected InvalidStateError"
670+ Right _ -> fail "expected InvalidStateError"
707− Left err -> name err `shouldEqual` "InvalidStateError"
671+ Left err -> name err `shouldEqual` "InvalidStateError"
708− }
672+ }
709− case res of
673+ case res of
710− Right _ -> fail "expected InvalidStateError"
674+ Right _ -> fail "expected InvalidStateError"
711− _ -> pure unit
675+ _ -> pure unit
712−
676+
713− it "openKeyCursor() - throw TransactionInactiveError on aborted transaction" do
677+ it "openKeyCursor() - throw TransactionInactiveError on aborted transaction" do
714− { db } <- setup
678+ { db } <- setup
715− { storeParams: { keyPath: [ "key" ], autoIncrement: false }
679+ { storeParams : { keyPath: ["key"], autoIncrement: false }
716− , indexParams: IDBObjectStore.defaultParameters
680+ , indexParams : IDBObjectStore.defaultParameters
717− , keyPath: [ "indexedProperty" ]
681+ , keyPath : ["indexedProperty"]
718− , values:
719− [ { key: 14, indexedProperty: "patate" } :+: Nothing
682+ , values : [ { key: 14, indexedProperty: "patate" } :+: Nothing
720− ]
683+ ]
721− , onUpgradeNeeded: Nothing
684+ , onUpgradeNeeded : Nothing
722− }
685+ }
723− let
686+ let cb =
724− cb =
725− { onSuccess: const $ pure unit
687+ { onSuccess : const $ pure unit
726− , onError: show >>> fail >>> launchAff'
688+ , onError : show >>> fail >>> launchAff'
727 , onComplete: pure unit
689 , onComplete: pure unit
728 }
690 }
729− tx <- IDBDatabase.transaction db [ "store" ] ReadOnly
691+ tx <- IDBDatabase.transaction db ["store"] ReadOnly
730− store <- IDBTransaction.objectStore tx "store"
692+ store <- IDBTransaction.objectStore tx "store"
731− index <- IDBObjectStore.index store "index"
693+ index <- IDBObjectStore.index store "index"
732− IDBTransaction.onAbort tx (pure unit)
694+ IDBTransaction.onAbort tx (pure unit)
733− IDBTransaction.abort tx
695+ IDBTransaction.abort tx
734− cursor <- attempt $ IDBIndex.openKeyCursor index Nothing Next cb
696+ cursor <- attempt $ IDBIndex.openKeyCursor index Nothing Next cb
735− case cursor of
697+ case cursor of
736− Right _ -> fail "expected TransactionInactiveError"
698+ Right _ -> fail "expected TransactionInactiveError"
737− Left err -> name err `shouldEqual` "TransactionInactiveError"
699+ Left err -> name err `shouldEqual` "TransactionInactiveError"
738−
700+
739− tearDown db
701+ tearDown db
740−
702+
741− it "openKeyCursor() - throw InvalidStateError when the index is deleted" do
703+ it "openKeyCursor() - throw InvalidStateError when the index is deleted" do
742− { db } <- setup
704+ { db } <- setup
743− { storeParams: { keyPath: [ "key" ], autoIncrement: false }
705+ { storeParams : { keyPath: ["key"], autoIncrement: false }
744− , indexParams: IDBObjectStore.defaultParameters
706+ , indexParams : IDBObjectStore.defaultParameters
745− , keyPath: [ "indexedProperty" ]
707+ , keyPath : ["indexedProperty"]
746− , values:
747− [ { key: 14, indexedProperty: "patate" } :+: Nothing
708+ , values : [ { key: 14, indexedProperty: "patate" } :+: Nothing
748− ]
709+ ]
749− , onUpgradeNeeded: Just $ \_ tx index -> launchAff' do
710+ , onUpgradeNeeded : Just $ \db tx index -> launchAff' do
750− let
711+ let cb =
751− cb =
752− { onSuccess: const $ pure unit
712+ { onSuccess : const $ pure unit
753− , onError: show >>> fail >>> launchAff'
713+ , onError : show >>> fail >>> launchAff'
754 , onComplete: pure unit
714 , onComplete: pure unit
755 }
715 }
756− store <- IDBTransaction.objectStore tx "store"
716+ store <- IDBTransaction.objectStore tx "store"
757− IDBObjectStore.deleteIndex store "index"
717+ IDBObjectStore.deleteIndex store "index"
758− cursor <- attempt $ IDBIndex.openKeyCursor index Nothing Next cb
718+ cursor <- attempt $ IDBIndex.openKeyCursor index Nothing Next cb
759− case cursor of
719+ case cursor of
760− Right _ -> fail "expected InvalidStateError"
720+ Right _ -> fail "expected InvalidStateError"
761− Left err -> name err `shouldEqual` "InvalidStateError"
721+ Left err -> name err `shouldEqual` "InvalidStateError"
762− }
722+ }
763−
723+
764− tearDown db
724+ tearDown db
765−
725+
766− it "openCursor() - throw InvalidStateError on index deleted by aborted upgrade" do
726+ it "openCursor() - throw InvalidStateError on index deleted by aborted upgrade" do
767− res <- attempt $ setup
727+ res <- attempt $ setup
768− { storeParams: { keyPath: [ "key" ], autoIncrement: false }
728+ { storeParams : { keyPath: ["key"], autoIncrement: false }
769− , indexParams: IDBObjectStore.defaultParameters
729+ , indexParams : IDBObjectStore.defaultParameters
770− , keyPath: [ "indexedProperty" ]
730+ , keyPath : ["indexedProperty"]
771− , values:
731+ , values : [ { key: 14, indexedProperty: "patate" } :+: Nothing
772− [ { key: 14, indexedProperty: "patate" } :+: Nothing
732+ ]
773− ]
733+ , onUpgradeNeeded : Just $ \db tx index -> launchAff' do
774− , onUpgradeNeeded: Just $ \db tx index -> launchAff' do
734+ let cb =
775− let
735+ { onSuccess : const $ pure unit
776− cb =
736+ , onError : show >>> fail >>> launchAff'
777− { onSuccess: const $ pure unit
778− , onError: show >>> fail >>> launchAff'
779 , onComplete: pure unit
737 , onComplete: pure unit
780 }
738 }
781− IDBTransaction.onAbort tx (pure unit)
739+ IDBTransaction.onAbort tx (pure unit)
782− IDBDatabase.onAbort db (pure unit)
740+ IDBDatabase.onAbort db (pure unit)
783− IDBTransaction.abort tx
741+ IDBTransaction.abort tx
784− cursor <- attempt $ IDBIndex.openCursor index Nothing Next cb
742+ cursor <- attempt $ IDBIndex.openCursor index Nothing Next cb
785− case cursor of
743+ case cursor of
786− Right _ -> fail "expected InvalidStateError"
744+ Right _ -> fail "expected InvalidStateError"
787− Left err -> name err `shouldEqual` "InvalidStateError"
745+ Left err -> name err `shouldEqual` "InvalidStateError"
788− }
746+ }
789− case res of
747+ case res of
790− Right _ -> fail "expected InvalidStateError"
748+ Right _ -> fail "expected InvalidStateError"
791− _ -> pure unit
749+ _ -> pure unit
792−
750+
793− it "openCursor() - throw TransactionInactiveError on aborted transaction" do
751+ it "openCursor() - throw TransactionInactiveError on aborted transaction" do
794− { db } <- setup
752+ { db } <- setup
795− { storeParams: { keyPath: [ "key" ], autoIncrement: false }
753+ { storeParams : { keyPath: ["key"], autoIncrement: false }
796− , indexParams: IDBObjectStore.defaultParameters
754+ , indexParams : IDBObjectStore.defaultParameters
797− , keyPath: [ "indexedProperty" ]
755+ , keyPath : ["indexedProperty"]
798− , values:
756+ , values : [ { key: 14, indexedProperty: "patate" } :+: Nothing
799− [ { key: 14, indexedProperty: "patate" } :+: Nothing
757+ ]
800− ]
758+ , onUpgradeNeeded : Nothing
801− , onUpgradeNeeded: Nothing
759+ }
802− }
760+ let cb =
803− let
761+ { onSuccess : const $ pure unit
804− cb =
762+ , onError : show >>> fail >>> launchAff'
805− { onSuccess: const $ pure unit
806− , onError: show >>> fail >>> launchAff'
807 , onComplete: pure unit
763 , onComplete: pure unit
808 }
764 }
809− tx <- IDBDatabase.transaction db [ "store" ] ReadOnly
765+ tx <- IDBDatabase.transaction db ["store"] ReadOnly
810− store <- IDBTransaction.objectStore tx "store"
766+ store <- IDBTransaction.objectStore tx "store"
811− index <- IDBObjectStore.index store "index"
767+ index <- IDBObjectStore.index store "index"
812− IDBTransaction.onAbort tx (pure unit)
768+ IDBTransaction.onAbort tx (pure unit)
813− IDBTransaction.abort tx
769+ IDBTransaction.abort tx
814− cursor <- attempt $ IDBIndex.openCursor index Nothing Next cb
770+ cursor <- attempt $ IDBIndex.openCursor index Nothing Next cb
815− case cursor of
771+ case cursor of
816− Right _ -> fail "expected TransactionInactiveError"
772+ Right _ -> fail "expected TransactionInactiveError"
817− Left err -> name err `shouldEqual` "TransactionInactiveError"
773+ Left err -> name err `shouldEqual` "TransactionInactiveError"
818−
774+
819− tearDown db
775+ tearDown db
820−
776+
821− it "openCursor() - throw InvalidStateError when the index is deleted" do
777+ it "openCursor() - throw InvalidStateError when the index is deleted" do
822− { db } <- setup
778+ { db } <- setup
823− { storeParams: { keyPath: [ "key" ], autoIncrement: false }
779+ { storeParams : { keyPath: ["key"], autoIncrement: false }
824− , indexParams: IDBObjectStore.defaultParameters
780+ , indexParams : IDBObjectStore.defaultParameters
825− , keyPath: [ "indexedProperty" ]
781+ , keyPath : ["indexedProperty"]
826− , values:
782+ , values : [ { key: 14, indexedProperty: "patate" } :+: Nothing
827− [ { key: 14, indexedProperty: "patate" } :+: Nothing
783+ ]
828− ]
784+ , onUpgradeNeeded : Just $ \db tx index -> launchAff' do
829− , onUpgradeNeeded: Just $ \db tx index -> launchAff' do
785+ let cb =
830− let
786+ { onSuccess : const $ pure unit
831− cb =
787+ , onError : show >>> fail >>> launchAff'
832− { onSuccess: const $ pure unit
833− , onError: show >>> fail >>> launchAff'
834 , onComplete: pure unit
788 , onComplete: pure unit
835 }
789 }
836− store <- IDBTransaction.objectStore tx "store"
790+ store <- IDBTransaction.objectStore tx "store"
837− IDBObjectStore.deleteIndex store "index"
791+ IDBObjectStore.deleteIndex store "index"
838− cursor <- attempt $ IDBIndex.openCursor index Nothing Next cb
792+ cursor <- attempt $ IDBIndex.openCursor index Nothing Next cb
839− case cursor of
793+ case cursor of
840− Right _ -> fail "expected InvalidStateError"
794+ Right _ -> fail "expected InvalidStateError"
841− Left err -> name err `shouldEqual` "InvalidStateError"
795+ Left err -> name err `shouldEqual` "InvalidStateError"
842− }
796+ }
843−
797+
844− tearDown db
798+ tearDown db
845−
799+
846− it "getKey() - multiEntry - adding keys" do
800+ it "getKey() - multiEntry - adding keys" do
847− { db } <- setup
801+ { db } <- setup
848− { storeParams: IDBDatabase.defaultParameters
802+ { storeParams : IDBDatabase.defaultParameters
849− , indexParams: { unique: false, multiEntry: true }
803+ , indexParams : { unique: false, multiEntry: true }
850− , keyPath: [ "name" ]
804+ , keyPath : ["name"]
851− , values:
805+ , values : [ { name: ["patate", "autruche"] } :+: (Just $ toKey 1)
852− [ { name: [ "patate", "autruche" ] } :+: (Just $ toKey 1)
806+ , { name: ["bob"] } :+: (Just $ toKey 2)
853− , { name: [ "bob" ] } :+: (Just $ toKey 2)
807+ ]
854− ]
808+ , onUpgradeNeeded : Just $ \_ _ index -> launchAff' do
855− , onUpgradeNeeded: Just $ \_ _ index -> launchAff' do
809+ key <- IDBIndex.getKey index (IDBKeyRange.only "patate")
856− key <- IDBIndex.getKey index (IDBKeyRange.only "patate")
810+ key `shouldEqual` (Just $ toKey 1)
857− key `shouldEqual` (Just $ toKey 1)
811+
858−
812+ key' <- IDBIndex.getKey index (IDBKeyRange.only "autruche")
859− key' <- IDBIndex.getKey index (IDBKeyRange.only "autruche")
813+ key' `shouldEqual` (Just $ toKey 1)
860− key' `shouldEqual` (Just $ toKey 1)
814+
861−
815+ key'' <- IDBIndex.getKey index (IDBKeyRange.only "bob")
862− key'' <- IDBIndex.getKey index (IDBKeyRange.only "bob")
816+ key'' `shouldEqual` (Just $ toKey 2)
863− key'' `shouldEqual` (Just $ toKey 2)
817+ }
864− }
818+ tearDown db
865− tearDown db
819+
866−
820+
867− it "get() - returns the record with the first key in the range" do
821+ it "get() - returns the record with the first key in the range" do
868− { db } <- setup
822+ { db } <- setup
869− { storeParams: { keyPath: [ "key" ], autoIncrement: false }
823+ { storeParams : { keyPath: ["key"], autoIncrement: false }
870− , indexParams: IDBObjectStore.defaultParameters
824+ , indexParams : IDBObjectStore.defaultParameters
871− , keyPath: [ "indexedProperty" ]
825+ , keyPath : ["indexedProperty"]
872− , values:
826+ , values : [ { key: 14, indexedProperty: "patate" } :+: Nothing
873− [ { key: 14, indexedProperty: "patate" } :+: Nothing
827+ , { key: 42, indexedProperty: "autruche" } :+: Nothing
874− , { key: 42, indexedProperty: "autruche" } :+: Nothing
828+ , { key: 1337, indexedProperty: "baguette" } :+: Nothing
875− , { key: 1337, indexedProperty: "baguette" } :+: Nothing
829+ ]
876− ]
830+ , onUpgradeNeeded : Nothing
877− , onUpgradeNeeded: Nothing
831+ }
878− }
832+
879−
833+ tx <- IDBDatabase.transaction db ["store"] ReadOnly
880− tx <- IDBDatabase.transaction db [ "store" ] ReadOnly
834+ store <- IDBTransaction.objectStore tx "store"
881− store <- IDBTransaction.objectStore tx "store"
835+ index <- IDBObjectStore.index store "index"
882− index <- IDBObjectStore.index store "index"
836+ val <- IDBIndex.get index (IDBKeyRange.lowerBound "autruche" false)
883− val <- IDBIndex.get index (IDBKeyRange.lowerBound "autruche" false)
837+ ((\r -> r.key) <$> val) `shouldEqual` (Just 42)
884− ((\r -> r.key) <$> val) `shouldEqual` (Just 42)
838+
885−
839+ tearDown db
886− tearDown db
840+
887−
841+ describe "IDBCursor" do
888− describe "IDBCursor" do
842+ let
889− let
890 tearDown db = do
843 tearDown db = do
891 IDBDatabase.close db
844 IDBDatabase.close db
892 _ <- IDBFactory.deleteDatabase (IDBDatabase.name db)
845 _ <- IDBFactory.deleteDatabase (IDBDatabase.name db)
893 pure unit
846 pure unit
894
847
895− setup
848+ setup :: forall value e e'.
896− :: forall value
849+ { storeParams :: { keyPath :: Array String, autoIncrement :: Boolean }
897− . { storeParams :: { keyPath :: Array String, autoIncrement :: Boolean }
850+ , indexParams :: { unique :: Boolean, multiEntry :: Boolean }
898− , indexParams :: { unique :: Boolean, multiEntry :: Boolean }
851+ , values :: Array (Tuple value (Maybe Key))
899− , values :: Array (Tuple value (Maybe Key))
852+ , keyPath :: Array String
900− , keyPath :: Array String
853+ , onUpgradeNeeded :: Maybe (Database -> Transaction -> Index -> Eff (idb :: IDB, avar :: AVAR, exception :: EXCEPTION | e') Unit)
901− , onUpgradeNeeded :: Maybe (Database -> Transaction -> Index -> Effect Unit)
854+ } -> Aff (idb :: IDB, avar :: AVAR | e) { db :: Database, index :: Index, store :: ObjectStore }
902− }
903− -> Aff { db :: Database, index :: Index, store :: ObjectStore }
904 setup { storeParams, indexParams, values, keyPath, onUpgradeNeeded } = do
855 setup { storeParams, indexParams, values, keyPath, onUpgradeNeeded } = do
905− let
856+ let onUpgradeNeeded' var db tx _ = launchAff' do
906− onUpgradeNeeded' var db tx _ = launchAff' do
857+ store <- IDBDatabase.createObjectStore db "store" storeParams
907− store <- IDBDatabase.createObjectStore db "store" storeParams
858+ _ <- traverse (uncurry (IDBObjectStore.add store)) values
908− _ <- traverse (uncurry (IDBObjectStore.add store)) values
859+ index <- IDBObjectStore.createIndex store "index" keyPath indexParams
909− index <- IDBObjectStore.createIndex store "index" keyPath indexParams
860+ liftEff $ maybe (pure unit) id (onUpgradeNeeded <*> pure db <*> pure tx <*> pure index)
910− liftEffect $ maybe (pure unit) identity (onUpgradeNeeded <*> pure db <*> pure tx <*> pure index)
861+ putVar { db, index, store } var
911− AVar.put { db, index, store } var
862+
912−
863+ var <- makeEmptyVar
913− var <- AVar.empty
864+ db <- IDBFactory.open "db" Nothing
914− db <- IDBFactory.open "db" Nothing
865+ { onUpgradeNeeded : Just (onUpgradeNeeded' var)
915− { onUpgradeNeeded: Just (onUpgradeNeeded' var)
866+ , onBlocked : Nothing
916− , onBlocked: Nothing
917 }
867 }
918− AVar.take var
868+ takeVar var
919−
869+
920− it "continue() - iterate to the next record" do
870+ it "continue() - iterate to the next record" do
921− { db } <- setup
871+ { db } <- setup
922− { storeParams: IDBDatabase.defaultParameters
872+ { storeParams : IDBDatabase.defaultParameters
923− , indexParams: IDBObjectStore.defaultParameters
873+ , indexParams : IDBObjectStore.defaultParameters
924− , keyPath: []
874+ , keyPath : []
925− , values:
875+ , values : [ "cupcake" :+: (Just $ toKey 4)
926− [ "cupcake" :+: (Just $ toKey 4)
876+ , "pancake" :+: (Just $ toKey 2)
927− , "pancake" :+: (Just $ toKey 2)
877+ , "pie" :+: (Just $ toKey 1)
928− , "pie" :+: (Just $ toKey 1)
878+ , "pie" :+: (Just $ toKey 3)
929− , "pie" :+: (Just $ toKey 3)
879+ ]
930− ]
880+ , onUpgradeNeeded: Nothing
931− , onUpgradeNeeded: Nothing
881+ }
932− }
882+ let cb vdone vvals =
933− let
934− cb vdone vvals =
935 { onComplete: launchAff' do
883 { onComplete: launchAff' do
936− AVar.put unit vdone
884+ putVar unit vdone
937
885
938− , onError: \error -> launchAff' do
886+ , onError: \error -> launchAff' do
939 fail $ "unexpected error: " <> show error
887 fail $ "unexpected error: " <> show error
940
888
941 , onSuccess: \cursor -> launchAff' do
889 , onSuccess: \cursor -> launchAff' do
942− vals <- AVar.take vvals
890+ vals <- takeVar vvals
943 pure (IDBCursor.value cursor) >>= shouldEqual (maybe "" _.v $ head vals)
891 pure (IDBCursor.value cursor) >>= shouldEqual (maybe "" _.v $ head vals)
944− IDBCursor.primaryKey cursor >>= shouldEqual (maybe (toKey 0) _.k $ head vals)
892+ IDBCursor.primaryKey cursor >>= shouldEqual (maybe (toKey 0) _.k $ head vals)
945− AVar.put (drop 1 vals) vvals
893+ putVar (drop 1 vals) vvals
946 IDBCursor.continue cursor none
894 IDBCursor.continue cursor none
947 }
895 }
948− vdone <- AVar.empty
896+ vdone <- makeEmptyVar
949− vvals <- AVar.new
897+ vvals <- makeVar
950− [ { v: "pie", k: toKey 1 }
898+ [ { v: "pie" , k: toKey 1 }
951− , { v: "pancake", k: toKey 2 }
899+ , { v: "pancake", k: toKey 2 }
952− , { v: "pie", k: toKey 3 }
900+ , { v: "pie" , k: toKey 3 }
953− , { v: "cupcake", k: toKey 4 }
901+ , { v: "cupcake", k: toKey 4 }
954− ]
902+ ]
955− tx <- IDBDatabase.transaction db [ "store" ] ReadOnly
903+ tx <- IDBDatabase.transaction db ["store"] ReadOnly
956− store <- IDBTransaction.objectStore tx "store"
904+ store <- IDBTransaction.objectStore tx "store"
957− IDBObjectStore.openCursor store Nothing Next (cb vdone vvals)
905+ IDBObjectStore.openCursor store Nothing Next (cb vdone vvals)
958− AVar.take vdone
906+ takeVar vdone
959− tearDown db
907+ tearDown db
960−
908+
961− it "continue() - attempt to iterate in the wrong direction" do
909+ it "continue() - attempt to iterate in the wrong direction" do
962− { db } <- setup
910+ { db } <- setup
963− { storeParams: IDBDatabase.defaultParameters
911+ { storeParams : IDBDatabase.defaultParameters
964− , indexParams: IDBObjectStore.defaultParameters
912+ , indexParams : IDBObjectStore.defaultParameters
965− , keyPath: []
913+ , keyPath : []
966− , values:
914+ , values : [ "cupcake" :+: (Just $ toKey 4)
967− [ "cupcake" :+: (Just $ toKey 4)
915+ , "pancake" :+: (Just $ toKey 2)
968− , "pancake" :+: (Just $ toKey 2)
916+ , "pie" :+: (Just $ toKey 1)
969− , "pie" :+: (Just $ toKey 1)
917+ , "pie" :+: (Just $ toKey 3)
970− , "pie" :+: (Just $ toKey 3)
918+ ]
971− ]
919+ , onUpgradeNeeded: Nothing
972− , onUpgradeNeeded: Nothing
920+ }
973− }
921+ let cb vdone =
974− let
975− cb vdone =
976 { onComplete: launchAff' do
922 { onComplete: launchAff' do
977 fail $ "shouldn't complete"
923 fail $ "shouldn't complete"
978
924
979− , onError: \error -> launchAff' do
925+ , onError: \error -> launchAff' do
980 fail $ "unexpected error: " <> show error
926 fail $ "unexpected error: " <> show error
981
927
982 , onSuccess: \cursor -> launchAff' do
928 , onSuccess: \cursor -> launchAff' do
983 res <- attempt $ IDBCursor.continue cursor (Just 1)
929 res <- attempt $ IDBCursor.continue cursor (Just 1)
984 case res of
930 case res of
985− Left err -> do
931+ Left err -> do
986 name err `shouldEqual` "DataError"
932 name err `shouldEqual` "DataError"
987− AVar.put unit vdone
933+ putVar unit vdone
988 Right _ -> do
934 Right _ -> do
989 fail "expected continue to fail"
935 fail "expected continue to fail"
990 }
936 }
991− vdone <- AVar.empty
937+ vdone <- makeEmptyVar
992− tx <- IDBDatabase.transaction db [ "store" ] ReadOnly
938+ tx <- IDBDatabase.transaction db ["store"] ReadOnly
993− store <- IDBTransaction.objectStore tx "store"
939+ store <- IDBTransaction.objectStore tx "store"
994− IDBObjectStore.openCursor store Nothing Next (cb vdone)
940+ IDBObjectStore.openCursor store Nothing Next (cb vdone)
995− AVar.take vdone
941+ takeVar vdone
996− tearDown db
942+ tearDown db
997−
943+
998− it "advance() - iterate cursor number of times specified by count" do
944+
999− { db } <- setup
945+ it "advance() - iterate cursor number of times specified by count" do
1000− { storeParams: { keyPath: [ "pKey" ], autoIncrement: false }
946+ { db } <- setup
1001− , indexParams: IDBObjectStore.defaultParameters
947+ { storeParams : { keyPath: ["pKey"], autoIncrement: false }
1002− , keyPath: []
948+ , indexParams : IDBObjectStore.defaultParameters
1003− , values:
949+ , keyPath : []
1004− [ { pKey: "pkey_0", iKey: "ikey_0" } :+: Nothing
950+ , values : [ { pKey: "pkey_0", iKey: "ikey_0" } :+: Nothing
1005− , { pKey: "pkey_1", iKey: "ikey_1" } :+: Nothing
951+ , { pKey: "pkey_1", iKey: "ikey_1" } :+: Nothing
1006− , { pKey: "pkey_2", iKey: "ikey_2" } :+: Nothing
952+ , { pKey: "pkey_2", iKey: "ikey_2" } :+: Nothing
1007− , { pKey: "pkey_3", iKey: "ikey_3" } :+: Nothing
953+ , { pKey: "pkey_3", iKey: "ikey_3" } :+: Nothing
1008− ]
954+ ]
1009− , onUpgradeNeeded: Nothing
955+ , onUpgradeNeeded: Nothing
1010− }
956+ }
1011− let
957+ let cb vdone vjump =
1012− cb vdone vjump =
1013 { onComplete: launchAff' do
958 { onComplete: launchAff' do
1014− AVar.put unit vdone
959+ putVar unit vdone
1015
960
1016− , onError: \error -> launchAff' do
961+ , onError: \error -> launchAff' do
1017 fail $ "unexpected error: " <> show error
962 fail $ "unexpected error: " <> show error
1018
963
1019 , onSuccess: \cursor -> launchAff' do
964 , onSuccess: \cursor -> launchAff' do
1020− jump <- AVar.take vjump
965+ jump <- takeVar vjump
1021− if jump then do
966+ if jump
1022− IDBCursor.advance cursor 3
967+ then do
1023− else do
968+ IDBCursor.advance cursor 3
1024− let value = IDBCursor.value cursor
969+ else do
1025− value.pKey `shouldEqual` "pkey_3"
970+ let value = IDBCursor.value cursor
1026− value.iKey `shouldEqual` "ikey_3"
971+ value.pKey `shouldEqual` "pkey_3"
1027− IDBCursor.continue cursor none
972+ value.iKey `shouldEqual` "ikey_3"
1028− AVar.put false vjump
973+ IDBCursor.continue cursor none
974+ putVar false vjump
1029 }
975 }
1030− vdone <- AVar.empty
976+ vdone <- makeEmptyVar
1031− vjump <- AVar.new true
977+ vjump <- makeVar true
1032− tx <- IDBDatabase.transaction db [ "store" ] ReadOnly
978+ tx <- IDBDatabase.transaction db ["store"] ReadOnly
1033− store <- IDBTransaction.objectStore tx "store"
979+ store <- IDBTransaction.objectStore tx "store"
1034− IDBObjectStore.openCursor store Nothing Next (cb vdone vjump)
980+ IDBObjectStore.openCursor store Nothing Next (cb vdone vjump)
1035− AVar.take vdone
981+ takeVar vdone
1036− tearDown db
982+ tearDown db
1037−
983+
1038− it "delete() - remove a record from the object store" do
984+ it "delete() - remove a record from the object store" do
1039− { db } <- setup
985+ { db } <- setup
1040− { storeParams: { keyPath: [ "pKey" ], autoIncrement: false }
986+ { storeParams : { keyPath: ["pKey"], autoIncrement: false }
1041− , indexParams: IDBObjectStore.defaultParameters
987+ , indexParams : IDBObjectStore.defaultParameters
1042− , keyPath: []
988+ , keyPath : []
1043− , values:
989+ , values : [ { pKey: "pkey_0", iKey: "ikey_0" } :+: Nothing
1044− [ { pKey: "pkey_0", iKey: "ikey_0" } :+: Nothing
990+ , { pKey: "pkey_1", iKey: "ikey_1" } :+: Nothing
1045− , { pKey: "pkey_1", iKey: "ikey_1" } :+: Nothing
991+ , { pKey: "pkey_2", iKey: "ikey_2" } :+: Nothing
1046− , { pKey: "pkey_2", iKey: "ikey_2" } :+: Nothing
992+ , { pKey: "pkey_3", iKey: "ikey_3" } :+: Nothing
1047− , { pKey: "pkey_3", iKey: "ikey_3" } :+: Nothing
993+ ]
1048− ]
994+ , onUpgradeNeeded: Nothing
1049− , onUpgradeNeeded: Nothing
995+ }
1050− }
996+ let cb vdone store =
1051− let
1052− cb vdone store =
1053 { onComplete: launchAff' do
997 { onComplete: launchAff' do
1054 mval <- map _.pKey <$> IDBIndex.get store (IDBKeyRange.only "pkey_0")
998 mval <- map _.pKey <$> IDBIndex.get store (IDBKeyRange.only "pkey_0")
1055 mval `shouldEqual` (Nothing :: Maybe String)
999 mval `shouldEqual` (Nothing :: Maybe String)
1056− AVar.put unit vdone
1000+ putVar unit vdone
1057
1001
1058− , onError: \error -> launchAff' do
1002+ , onError: \error -> launchAff' do
1059 fail $ "unexpected error: " <> show error
1003 fail $ "unexpected error: " <> show error
1060
1004
1061 , onSuccess: \cursor -> launchAff' do
1005 , onSuccess: \cursor -> launchAff' do
@@ -1064,31 +1008,29 @@ main = do
1064 IDBCursor.delete cursor
1008 IDBCursor.delete cursor
1065 IDBCursor.advance cursor 4
1009 IDBCursor.advance cursor 4
1066 }
1010 }
1067− vdone <- AVar.empty
1011+ vdone <- makeEmptyVar
1068− tx <- IDBDatabase.transaction db [ "store" ] ReadWrite
1012+ tx <- IDBDatabase.transaction db ["store"] ReadWrite
1069− store <- IDBTransaction.objectStore tx "store"
1013+ store <- IDBTransaction.objectStore tx "store"
1070− IDBObjectStore.openCursor store Nothing Next (cb vdone store)
1014+ IDBObjectStore.openCursor store Nothing Next (cb vdone store)
1071− AVar.take vdone
1015+ takeVar vdone
1072− tearDown db
1016+ tearDown db
1073−
1017+
1074− it "update() - modify a record in the object store" do
1018+ it "update() - modify a record in the object store" do
1075− { db } <- setup
1019+ { db } <- setup
1076− { storeParams: { keyPath: [ "pKey" ], autoIncrement: false }
1020+ { storeParams : { keyPath: ["pKey"], autoIncrement: false }
1077− , indexParams: IDBObjectStore.defaultParameters
1021+ , indexParams : IDBObjectStore.defaultParameters
1078− , keyPath: []
1022+ , keyPath : []
1079− , values:
1023+ , values : [ { pKey: "pkey_0", iKey: "ikey_0" } :+: Nothing
1080− [ { pKey: "pkey_0", iKey: "ikey_0" } :+: Nothing
1024+ ]
1081− ]
1025+ , onUpgradeNeeded: Nothing
1082− , onUpgradeNeeded: Nothing
1026+ }
1083− }
1027+ let cb vdone store =
1084− let
1085− cb vdone store =
1086 { onComplete: launchAff' do
1028 { onComplete: launchAff' do
1087 mval <- map _.iKey <$> IDBIndex.get store (IDBKeyRange.only "pkey_0")
1029 mval <- map _.iKey <$> IDBIndex.get store (IDBKeyRange.only "pkey_0")
1088 mval `shouldEqual` (Just "patate")
1030 mval `shouldEqual` (Just "patate")
1089− AVar.put unit vdone
1031+ putVar unit vdone
1090
1032
1091− , onError: \error -> launchAff' do
1033+ , onError: \error -> launchAff' do
1092 fail $ "unexpected error: " <> show error
1034 fail $ "unexpected error: " <> show error
1093
1035
1094 , onSuccess: \cursor -> launchAff' do
1036 , onSuccess: \cursor -> launchAff' do
@@ -1098,29 +1040,27 @@ main = do
1098 key `shouldEqual` toKey "pkey_0"
1040 key `shouldEqual` toKey "pkey_0"
1099 IDBCursor.advance cursor 4
1041 IDBCursor.advance cursor 4
1100 }
1042 }
1101− vdone <- AVar.empty
1043+ vdone <- makeEmptyVar
1102− tx <- IDBDatabase.transaction db [ "store" ] ReadWrite
1044+ tx <- IDBDatabase.transaction db ["store"] ReadWrite
1103− store <- IDBTransaction.objectStore tx "store"
1045+ store <- IDBTransaction.objectStore tx "store"
1104− IDBObjectStore.openCursor store Nothing Next (cb vdone store)
1046+ IDBObjectStore.openCursor store Nothing Next (cb vdone store)
1105− AVar.take vdone
1047+ takeVar vdone
1106− tearDown db
1048+ tearDown db
1107−
1049+
1108− it "update() - throw ReadOnlyError after update on ReadOnly transaction" do
1050+ it "update() - throw ReadOnlyError after update on ReadOnly transaction" do
1109− { db } <- setup
1051+ { db } <- setup
1110− { storeParams: { keyPath: [ "pKey" ], autoIncrement: false }
1052+ { storeParams : { keyPath: ["pKey"], autoIncrement: false }
1111− , indexParams: IDBObjectStore.defaultParameters
1053+ , indexParams : IDBObjectStore.defaultParameters
1112− , keyPath: []
1054+ , keyPath : []
1113− , values:
1055+ , values : [ { pKey: "pkey_0", iKey: "ikey_0" } :+: Nothing
1114− [ { pKey: "pkey_0", iKey: "ikey_0" } :+: Nothing
1056+ ]
1115− ]
1057+ , onUpgradeNeeded: Nothing
1116− , onUpgradeNeeded: Nothing
1058+ }
1117− }
1059+ let cb vdone =
1118− let
1119− cb vdone =
1120 { onComplete: launchAff' do
1060 { onComplete: launchAff' do
1121 fail $ "shouldn't complete"
1061 fail $ "shouldn't complete"
1122
1062
1123− , onError: \error -> launchAff' do
1063+ , onError: \error -> launchAff' do
1124 fail $ "unexpected error: " <> show error
1064 fail $ "unexpected error: " <> show error
1125
1065
1126 , onSuccess: \cursor -> launchAff' do
1066 , onSuccess: \cursor -> launchAff' do
@@ -1128,14 +1068,13 @@ main = do
1128 case res of
1068 case res of
1129 Left err -> do
1069 Left err -> do
1130 name err `shouldEqual` "ReadOnlyError"
1070 name err `shouldEqual` "ReadOnlyError"
1131− AVar.put unit vdone
1071+ putVar unit vdone
1132 Right _ ->
1072 Right _ ->
1133 fail $ "expected ReadOnlyError"
1073 fail $ "expected ReadOnlyError"
1134 }
1074 }
1135− vdone <- AVar.empty
1075+ vdone <- makeEmptyVar
1136− tx <- IDBDatabase.transaction db [ "store" ] ReadOnly
1076+ tx <- IDBDatabase.transaction db ["store"] ReadOnly
1137− store <- IDBTransaction.objectStore tx "store"
1077+ store <- IDBTransaction.objectStore tx "store"
1138− IDBObjectStore.openCursor store Nothing Next (cb vdone)
1078+ IDBObjectStore.openCursor store Nothing Next (cb vdone)
1139− AVar.take vdone
1079+ takeVar vdone
1140− tearDown db
1080+ tearDown db
1141−
yarn.lockdeleted−81
@@ -1,81 +0,0 @@
1−# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2−# yarn lockfile v1
3−
4−
5−base64-arraybuffer-es6@^0.7.0:
6− version "0.7.0"
7− resolved "https://registry.yarnpkg.com/base64-arraybuffer-es6/-/base64-arraybuffer-es6-0.7.0.tgz#dbe1e6c87b1bf1ca2875904461a7de40f21abc86"
8− integrity sha512-ESyU/U1CFZDJUdr+neHRhNozeCv72Y7Vm0m1DCbjX3KBjT6eYocvAJlSk6+8+HkVwXlT1FNxhGW6q3UKAlCvvw==
9−
10−domexception@^1.0.1:
11− version "1.0.1"
12− resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
13− integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==
14− dependencies:
15− webidl-conversions "^4.0.2"
16−
17−fake-indexeddb@^4.0.1:
18− version "4.0.1"
19− resolved "https://registry.yarnpkg.com/fake-indexeddb/-/fake-indexeddb-4.0.1.tgz#09bb2468e21d0832b2177e894765fb109edac8fb"
20− integrity sha512-hFRyPmvEZILYgdcLBxVdHLik4Tj3gDTu/g7s9ZDOiU3sTNiGx+vEu1ri/AMsFJUZ/1sdRbAVrEcKndh3sViBcA==
21− dependencies:
22− realistic-structured-clone "^3.0.0"
23−
24−lodash@^4.7.0:
25− version "4.17.21"
26− resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
27− integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
28−
29−punycode@^2.1.1:
30− version "2.3.0"
31− resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
32− integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==
33−
34−realistic-structured-clone@^3.0.0:
35− version "3.0.0"
36− resolved "https://registry.yarnpkg.com/realistic-structured-clone/-/realistic-structured-clone-3.0.0.tgz#7b518049ce2dad41ac32b421cd297075b00e3e35"
37− integrity sha512-rOjh4nuWkAqf9PWu6JVpOWD4ndI+JHfgiZeMmujYcPi+fvILUu7g6l26TC1K5aBIp34nV+jE1cDO75EKOfHC5Q==
38− dependencies:
39− domexception "^1.0.1"
40− typeson "^6.1.0"
41− typeson-registry "^1.0.0-alpha.20"
42−
43−tr46@^2.1.0:
44− version "2.1.0"
45− resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240"
46− integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==
47− dependencies:
48− punycode "^2.1.1"
49−
50−typeson-registry@^1.0.0-alpha.20:
51− version "1.0.0-alpha.39"
52− resolved "https://registry.yarnpkg.com/typeson-registry/-/typeson-registry-1.0.0-alpha.39.tgz#9e0f5aabd5eebfcffd65a796487541196f4b1211"
53− integrity sha512-NeGDEquhw+yfwNhguLPcZ9Oj0fzbADiX4R0WxvoY8nGhy98IbzQy1sezjoEFWOywOboj/DWehI+/aUlRVrJnnw==
54− dependencies:
55− base64-arraybuffer-es6 "^0.7.0"
56− typeson "^6.0.0"
57− whatwg-url "^8.4.0"
58−
59−typeson@^6.0.0, typeson@^6.1.0:
60− version "6.1.0"
61− resolved "https://registry.yarnpkg.com/typeson/-/typeson-6.1.0.tgz#5b2a53705a5f58ff4d6f82f965917cabd0d7448b"
62− integrity sha512-6FTtyGr8ldU0pfbvW/eOZrEtEkczHRUtduBnA90Jh9kMPCiFNnXIon3vF41N0S4tV1HHQt4Hk1j4srpESziCaA==
63−
64−webidl-conversions@^4.0.2:
65− version "4.0.2"
66− resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
67− integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==
68−
69−webidl-conversions@^6.1.0:
70− version "6.1.0"
71− resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514"
72− integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==
73−
74−whatwg-url@^8.4.0:
75− version "8.7.0"
76− resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77"
77− integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==
78− dependencies:
79− lodash "^4.7.0"
80− tr46 "^2.1.0"
81− webidl-conversions "^6.1.0"