Add JSON coders for id-dict

2-transfer-tools
Bram van den Heuvel 2023-12-14 15:29:05 +01:00
parent c5e1b756a2
commit 6fa7904b8d
2 changed files with 53 additions and 1 deletions

View File

@ -11,6 +11,7 @@
"elm-version": "0.19.0 <= v < 0.20.0", "elm-version": "0.19.0 <= v < 0.20.0",
"dependencies": { "dependencies": {
"elm/core": "1.0.0 <= v < 2.0.0", "elm/core": "1.0.0 <= v < 2.0.0",
"elm/json": "1.0.0 <= v < 2.0.0",
"miniBill/elm-fast-dict": "1.0.0 <= v < 2.0.0" "miniBill/elm-fast-dict": "1.0.0 <= v < 2.0.0"
}, },
"test-dependencies": {} "test-dependencies": {}

View File

@ -1,4 +1,4 @@
module Internal.Tools.Iddict exposing (Iddict, empty, get, insert, isEmpty, keys, map, member, remove, singleton, size, values) module Internal.Tools.Iddict exposing (Iddict, decoder, empty, encode, get, insert, isEmpty, keys, map, member, remove, singleton, size, values)
{-| The id-dict is a data type that lets us store values in a dictionary using {-| The id-dict is a data type that lets us store values in a dictionary using
unique identifiers. This can be used as a dictionary where the keys do not unique identifiers. This can be used as a dictionary where the keys do not
matter. matter.
@ -21,9 +21,15 @@ do not need to generate identifiers yourself.
## Lists ## Lists
@docs keys, values @docs keys, values
## JSON coders
@docs encode, decoder
-} -}
import FastDict as Dict exposing (Dict) import FastDict as Dict exposing (Dict)
import Json.Decode as D
import Json.Encode as E
{-| The Iddict data type. {-| The Iddict data type.
-} -}
@ -33,6 +39,38 @@ type Iddict a
, dict : Dict Int a , dict : Dict Int a
} }
{-| Decode an id-dict from a JSON value.
-}
decoder : D.Decoder a -> D.Decoder (Iddict a)
decoder xDecoder =
D.map2
(\c pairs ->
let
dict : Dict Int a
dict =
pairs
|> List.filterMap
(\(k, v) ->
k
|> String.toInt
|> Maybe.map (\n -> (n, v))
)
|> Dict.fromList
in
Iddict
{ cursor =
Dict.keys dict -- Larger than all values in the list
|> List.map ((+) 1)
|> List.maximum
|> Maybe.withDefault 0
|> max (Dict.size dict) -- At least the dict size
|> max c -- At least the given value
, dict = dict
}
)
(D.field "cursor" D.int)
(D.field "dict" <| D.keyValuePairs xDecoder)
{-| Create an empty id-dict. {-| Create an empty id-dict.
-} -}
empty : Iddict a empty : Iddict a
@ -42,6 +80,19 @@ empty =
, dict = Dict.empty , dict = Dict.empty
} }
{-| Encode an id-dict to a JSON value.
-}
encode : (a -> E.Value) -> Iddict a -> E.Value
encode encodeX (Iddict d) =
E.object
[ ( "cursor", E.int d.cursor )
, ( "dict",
d.dict
|> Dict.toCoreDict
|> E.dict String.fromInt encodeX
)
]
{-| Get a value from the id-dict using its key. {-| Get a value from the id-dict using its key.
-} -}
get : Int -> Iddict a -> Maybe a get : Int -> Iddict a -> Maybe a