@@ -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