Skip to content

Commit 390251b

Browse files
Simplify manual collection decoders
1 parent 56ec04a commit 390251b

File tree

1 file changed

+12
-20
lines changed

1 file changed

+12
-20
lines changed

src/Decode.fs

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -422,25 +422,7 @@ module Decode =
422422
// Data structure ///
423423
////////////////////
424424

425-
let list (decoder : Decoder<'value>) : Decoder<'value list> =
426-
fun path value ->
427-
if Helpers.isArray value then
428-
let mutable i = -1
429-
let tokens = Helpers.asArray value
430-
(Ok [], tokens) ||> Array.fold (fun acc value ->
431-
i <- i + 1
432-
match acc with
433-
| Error _ -> acc
434-
| Ok acc ->
435-
match decoder (path + ".[" + (i.ToString()) + "]") value with
436-
| Error er -> Error er
437-
| Ok value -> Ok (value::acc))
438-
|> Result.map List.rev
439-
else
440-
(path, BadPrimitive ("a list", value))
441-
|> Error
442-
443-
let array (decoder : Decoder<'value>) : Decoder<'value array> =
425+
let private arrayWith expectedMsg (mapping: 'value[] -> 'result) (decoder : Decoder<'value>) : Decoder<'result> =
444426
fun path value ->
445427
if Helpers.isArray value then
446428
let mutable i = -1
@@ -454,10 +436,20 @@ module Decode =
454436
match decoder (path + ".[" + (i.ToString()) + "]") value with
455437
| Error er -> Error er
456438
| Ok value -> acc.[i] <- value; Ok acc)
439+
|> Result.map mapping
457440
else
458-
(path, BadPrimitive ("an array", value))
441+
(path, BadPrimitive (expectedMsg, value))
459442
|> Error
460443

444+
let list (decoder : Decoder<'value>) : Decoder<'value list> =
445+
arrayWith "a list" List.ofArray decoder
446+
447+
let seq (decoder : Decoder<'value>) : Decoder<'value seq> =
448+
arrayWith "a seq" Seq.ofArray decoder
449+
450+
let array (decoder : Decoder<'value>) : Decoder<'value array> =
451+
arrayWith "an array" id decoder
452+
461453
let keyValuePairs (decoder : Decoder<'value>) : Decoder<(string * 'value) list> =
462454
fun path value ->
463455
if Helpers.isObject value then

0 commit comments

Comments
 (0)