From 966117d423d92cddb06c8b12047d7692facf72b2 Mon Sep 17 00:00:00 2001 From: Joey Bright Date: Sat, 8 Aug 2026 10:19:56 -0700 Subject: [PATCH 1/2] Use iterators for `getOne` and `getMaybeOne` functions --- src/Gren/Kernel/Sqlite.js | 45 ++++++++++++++++++++++++++++++++++++++- src/Sqlite.gren | 23 ++++---------------- 2 files changed, 48 insertions(+), 20 deletions(-) diff --git a/src/Gren/Kernel/Sqlite.js b/src/Gren/Kernel/Sqlite.js index 80e212c..0fad498 100644 --- a/src/Gren/Kernel/Sqlite.js +++ b/src/Gren/Kernel/Sqlite.js @@ -1,6 +1,6 @@ /* -import Sqlite exposing (GenericError, ForeignKeyError, UniqueConstraintError, DecodingError) +import Sqlite exposing (GenericError, ForeignKeyError, UniqueConstraintError, DecodingError, MultipleResultsError) import Gren.Kernel.FilePath exposing (toString) import Gren.Kernel.Scheduler exposing (binding, succeed, fail) import Gren.Kernel.Json exposing (wrap, unwrap) @@ -8,6 +8,7 @@ import Json.Decode as Decode exposing (decodeValue) import Result exposing (isOk) import Sqlite.Encode as SqliteEncode exposing (toJson) import Sqlite.Decode as SqliteDecode exposing (toJson) +import Maybe exposing (Just, Nothing) */ @@ -82,6 +83,48 @@ var _Sqlite_getAll = F2(function (query, db) { }); }); +var _Sqlite_getMaybeOne = F2(function (query, db) { + return __Scheduler_binding(function (callback) { + try { + const prepped = db.prepare(query.__$query); + const params = __Json_unwrap(__SqliteEncode_toJson(query.__$parameters)); + const rowDecoder = __SqliteDecode_toJson(query.__$rowDecoder); + const iterator = prepped.iterate(params); + + const value = iterator.next().value; + + if (!value) { + return callback(__Scheduler_succeed(__Maybe_Nothing)) + } + + if (!iterator.next().done) { + var count = 2; + for (const value of iterator) { + count++; + } + return callback(__Scheduler_fail(__Sqlite_MultipleResultsError(count))) + } + + const result = A2( + __Decode_decodeValue, + rowDecoder, + _Json_wrap(value), + ); + + if (__Result_isOk(result)) { + callback(__Scheduler_succeed(__Maybe_Just(result.a))) + } else { + return callback( + __Scheduler_fail(__Sqlite_DecodingError(result.a)), + ); + } + } + catch (e) { + callback(_Sqlite_constructError(e)); + } + }); +}); + var _Sqlite_executeMany = F3(function (statement, values, db) { return __Scheduler_binding(function (callback) { try { diff --git a/src/Sqlite.gren b/src/Sqlite.gren index cc660cc..68ca15f 100644 --- a/src/Sqlite.gren +++ b/src/Sqlite.gren @@ -76,36 +76,21 @@ type alias Query value = getOne : Database -> Query value -> Task Error value getOne db query = - getAll db query + Gren.Kernel.Sqlite.getMaybeOne query db |> Task.andThen (\results -> when results is - [] -> + Nothing -> Task.fail NoResultsError - [ value ] -> + Just value -> Task.succeed value - - _ -> - Task.fail (MultipleResultsError (Array.length results)) ) getMaybeOne : Database -> Query value -> Task Error (Maybe value) getMaybeOne db query = - getAll db query - |> Task.andThen - (\results -> - when results is - [] -> - Task.succeed Nothing - - [ value ] -> - Task.succeed (Just value) - - _ -> - Task.fail (MultipleResultsError (Array.length results)) - ) + Gren.Kernel.Sqlite.getMaybeOne query db getAll : Database -> Query value -> Task Error (Array value) From 2502e209156acd3731ad50599cd124ffb0d766b3 Mon Sep 17 00:00:00 2001 From: Joey Bright Date: Sat, 8 Aug 2026 10:26:38 -0700 Subject: [PATCH 2/2] Ran `prettier` to fix formatting verification --- src/Gren/Kernel/Sqlite.js | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/Gren/Kernel/Sqlite.js b/src/Gren/Kernel/Sqlite.js index 0fad498..f346e0d 100644 --- a/src/Gren/Kernel/Sqlite.js +++ b/src/Gren/Kernel/Sqlite.js @@ -94,32 +94,25 @@ var _Sqlite_getMaybeOne = F2(function (query, db) { const value = iterator.next().value; if (!value) { - return callback(__Scheduler_succeed(__Maybe_Nothing)) + return callback(__Scheduler_succeed(__Maybe_Nothing)); } if (!iterator.next().done) { var count = 2; for (const value of iterator) { - count++; + count++; } - return callback(__Scheduler_fail(__Sqlite_MultipleResultsError(count))) + return callback(__Scheduler_fail(__Sqlite_MultipleResultsError(count))); } - const result = A2( - __Decode_decodeValue, - rowDecoder, - _Json_wrap(value), - ); + const result = A2(__Decode_decodeValue, rowDecoder, _Json_wrap(value)); if (__Result_isOk(result)) { - callback(__Scheduler_succeed(__Maybe_Just(result.a))) + callback(__Scheduler_succeed(__Maybe_Just(result.a))); } else { - return callback( - __Scheduler_fail(__Sqlite_DecodingError(result.a)), - ); + return callback(__Scheduler_fail(__Sqlite_DecodingError(result.a))); } - } - catch (e) { + } catch (e) { callback(_Sqlite_constructError(e)); } });