[{"name":"Id","comment":"\nModule in which the base Id type is defined\n\n# Types\n@docs Id, Counter, Dict, Set, CounterDict, Dict_, List, CounterList\n\n# Functions\n@docs toString, debugId\n\n# Parser\n@docs parser\n\n# Json\n@docs encode, decoder\n","unions":[],"aliases":[{"name":"Counter","comment":" Alias for [`Id.Counter.Counter`](Id.Counter#Counter) ","args":["id"],"type":"Id.Counter.Counter id"},{"name":"CounterDict","comment":" Alias for [`Id.CounterDict.CounterDict`](Id.CounterDict#CounterDict) ","args":["id","value"],"type":"Id.CounterDict.CounterDict id value"},{"name":"CounterList","comment":" Alias for ['Id.CounterList.CounterList'](Id.CounterList#CounterList) ","args":["id","value"],"type":"Id.CounterList.CounterList id value"},{"name":"Dict","comment":" Alias for [`Id.Dict.Dict`](Id.Dict#Dict) ","args":["id","value"],"type":"Id.Dict.Dict id value"},{"name":"Dict_","comment":" Alias for [`Id.Dict.Dict_`](Id.Dict#Dict_) ","args":["counter","id","value"],"type":"Id.Dict.Dict_ counter id value"},{"name":"Id","comment":" The basis for making a Id type, has one generic type argument which should be an internal type to the module the Id type is defined in.\n\n    module UserId exposing(Id)\n\n    import Id\n\n    type alias Id = Id.Id IdInternal\n\n    type IdInternal = IdInternal\n","args":["a"],"type":"Internal.Id a"},{"name":"List","comment":" Alias for ['Id.List.List'](Id.List#List) ","args":["id","value"],"type":"Id.List.List id value"},{"name":"Set","comment":" Alias for [`Id.Set.Set`](Id.Set#Set) ","args":["id"],"type":"Id.Set.Set id"}],"values":[{"name":"debugId","comment":" Create an Id with an arbitrary value for debugging purposes. Requires 'Debug.todo' as a first argument ","type":"(String.String -> Basics.Never) -> Basics.Int -> Id.Id a"},{"name":"decoder","comment":" JSON Decoder for `Id` ","type":"Json.Decode.Decoder (Id.Id a)"},{"name":"encode","comment":" Encode `Id` to a JSON value ","type":"Id.Id a -> Json.Encode.Value"},{"name":"parser","comment":" Parser for 'Id' ","type":"Parser.Parser (Id.Id a)"},{"name":"toString","comment":" Converts an Id into a string representing the number inside the Id ","type":"Id.Id a -> String.String"}],"binops":[]},{"name":"Id.Counter","comment":"\n\n@docs Counter\n@docs new, newId, newId2, newId3, newId4, giveIds\n@docs accountForId, accountForIds, accountForItemIds\n@docs sanitizeIds\n\n# Json\n@docs encode, decoder\n\n","unions":[],"aliases":[{"name":"Counter","comment":"\nCounter type which is used to create [`Id`](Id#Id) values\n","args":["id"],"type":"Internal.Counter id"}],"values":[{"name":"accountForId","comment":"\nAccount for a single Ids.\nThis should not be necessary if you always make sure to use the counter result from [`newId`](Id.Counter#newId), but can be used to sanitize the counter after encoding and decoding a counter and values\n","type":"Internal.Id a -> Id.Counter.Counter (Internal.Id a) -> Id.Counter.Counter (Internal.Id a)"},{"name":"accountForIds","comment":"\nAccount for a list of Ids.\nThis should not be necessary if you always make sure to use the counter result from [`newId`](Id.Counter#newId), but can be used to sanitize the counter after encoding and decoding a counter and values\n","type":"List.List (Internal.Id a) -> Id.Counter.Counter (Internal.Id a) -> Id.Counter.Counter (Internal.Id a)"},{"name":"accountForItemIds","comment":"\nSame as [`accountForIds`](Id.Counter#accountForIds) but can be used for a list of values containing an [`Id`](Id#Id)\n\n    newCounter = accountForItemIds .id users counter\n","type":"(item -> Internal.Id a) -> List.List item -> Id.Counter.Counter (Internal.Id a) -> Id.Counter.Counter (Internal.Id a)"},{"name":"decoder","comment":" JSON Decoder for 'Counter' ","type":"Json.Decode.Decoder (Id.Counter.Counter id)"},{"name":"encode","comment":" Encode 'Counter' to a JSON value ","type":"Id.Counter.Counter id -> Json.Encode.Value"},{"name":"giveIds","comment":" Assign Ids to a number of values, make sure to use the new counter to create any new Ids ","type":"(Internal.Id a -> b -> c) -> Id.Counter.Counter (Internal.Id a) -> List.List b -> ( List.List c, Id.Counter.Counter (Internal.Id a) )"},{"name":"new","comment":" Create a new counter ","type":"a -> Id.Counter.Counter (Internal.Id a)"},{"name":"newId","comment":"  Creates a new [`Id`](Id#Id) and advanced the counter, make sure to use the new counter to create any new Ids ","type":"Id.Counter.Counter (Internal.Id a) -> ( Internal.Id a, Id.Counter.Counter (Internal.Id a) )"},{"name":"newId2","comment":" Same as [`newId`](Id.Counter#newId) but creates 2 Ids instead of 1 ","type":"Id.Counter.Counter (Internal.Id a) -> ( Internal.Id a, Internal.Id a, Id.Counter.Counter (Internal.Id a) )"},{"name":"newId3","comment":" Same as [`newId`](Id.Counter#newId) but creates 3 Ids instead of 1 ","type":"Id.Counter.Counter (Internal.Id a) -> ( { id1 : Internal.Id a, id2 : Internal.Id a, id3 : Internal.Id a }, Id.Counter.Counter (Internal.Id a) )"},{"name":"newId4","comment":" Same as [`newId`](Id.Counter#newId) but creates 4 Ids instead of 1 ","type":"Id.Counter.Counter (Internal.Id a) -> ( { id1 : Internal.Id a, id2 : Internal.Id a, id3 : Internal.Id a, id4 : Internal.Id a }, Id.Counter.Counter (Internal.Id a) )"},{"name":"sanitizeIds","comment":" Account for all used Ids in the counter (as in [`accountForIds`](Id.Counter#accountForIds)) and give new Ids to any items that have a duplicate [`Id`](Id#Id) ","type":"(val -> Internal.Id a) -> (val -> Internal.Id a -> val) -> List.List val -> Id.Counter.Counter (Internal.Id a) -> ( List.List val, Id.Counter.Counter (Internal.Id a) )"}],"binops":[]},{"name":"Id.CounterDict","comment":"\n@docs CounterDict\n\nMost of the functions in this module are a alias for the same function in [`Id.Dict`](Id.Dict), which can handle both 'Id.Dict' and 'Id.CounterDict'\n\n@docs empty, singleton, fromList, getCounter, toList, toDict\n@docs isEmpty, size\n@docs member, get, getFrom\n@docs add, addInto, addList, insert, remove, update\n@docs map, filter, filterMap, fold\n@docs ids, values\n@docs partition, diff, intersect, union\n@docs map2, map3, map4\n\n# Json\n@docs encode, decoder, leakyDecoder\n","unions":[],"aliases":[{"name":"CounterDict","comment":" A dictionary with a id counter ","args":["id","value"],"type":"Internal.Dict Basics.Never id value"}],"values":[{"name":"add","comment":" Add a value to the Dictionary and assign it a new [`Id`](Id#Id). ","type":"value -> Id.CounterDict.CounterDict (Internal.Id a) value -> ( Internal.Id a, Id.CounterDict.CounterDict (Internal.Id a) value )"},{"name":"addInto","comment":" Same as as [add](Id.Dict#add) but only returns the Dictionary ","type":"value -> Id.CounterDict.CounterDict (Internal.Id a) value -> Id.CounterDict.CounterDict (Internal.Id a) value"},{"name":"addList","comment":" Add a list of values to the Dictionary and assign them [`Id`](Id#Id)s ","type":"List.List value -> Id.CounterDict.CounterDict (Internal.Id a) value -> Id.CounterDict.CounterDict (Internal.Id a) value"},{"name":"decoder","comment":" JSON Decoder for [`CounterDict`](Id.CounterDict#CounterDict) ","type":"Json.Decode.Decoder value -> Json.Decode.Decoder (Id.CounterDict.CounterDict (Internal.Id id) value)"},{"name":"diff","comment":" Keep a Id-value pair when its Id does not appear in the second dictionary. ","type":"Id.CounterDict.CounterDict (Internal.Id a) b -> Internal.Dict o2 (Internal.Id a) c -> Id.CounterDict.CounterDict (Internal.Id a) b"},{"name":"empty","comment":" Create a empty `CounterDict` ","type":"Id.Counter.Counter (Internal.Id a) -> Id.CounterDict.CounterDict (Internal.Id a) value"},{"name":"encode","comment":" Encode [`CounterDict`](Id.CounterDict#CounterDict) to a JSON value ","type":"(value -> Json.Decode.Value) -> Id.CounterDict.CounterDict (Internal.Id id) value -> Json.Encode.Value"},{"name":"filter","comment":" Keep only the Id-value pairs that pass the given test. ","type":"(Internal.Id a -> value -> Basics.Bool) -> Id.CounterDict.CounterDict (Internal.Id a) value -> Id.CounterDict.CounterDict (Internal.Id a) value"},{"name":"filterMap","comment":" Apply a function to all values in the dictionary and filter out the values that return Nothing. ","type":"(Internal.Id a -> b -> Maybe.Maybe c) -> Id.CounterDict.CounterDict (Internal.Id a) b -> Id.CounterDict.CounterDict (Internal.Id a) c"},{"name":"fold","comment":" Fold over the Id-value pairs in a dictionary from lowest Id to highest Id. ","type":"(Internal.Id a -> value -> c -> c) -> c -> Id.CounterDict.CounterDict (Internal.Id a) value -> c"},{"name":"fromList","comment":" Create a new `CounterDict` from a list of values and assign an [`Id`](Id#Id) to every value ","type":"Internal.Counter (Internal.Id a) -> List.List value -> Id.CounterDict.CounterDict (Internal.Id a) value"},{"name":"get","comment":" Get the value associated with a Id. If the Id is not found, return Nothing. ","type":"Internal.Id a -> Id.CounterDict.CounterDict (Internal.Id a) value -> Maybe.Maybe value"},{"name":"getCounter","comment":" Get the counter from a counter dict ","type":"a -> Id.CounterDict.CounterDict (Internal.Id a) value -> Internal.Counter (Internal.Id a)"},{"name":"getFrom","comment":" Same as [get](Id.Dict#get) but with the arguments swapped, useful for pipelines. ","type":"Id.CounterDict.CounterDict (Internal.Id a) value -> Internal.Id a -> Maybe.Maybe value"},{"name":"ids","comment":" Get all of the Ids in a dictionary, sorted from lowest to highest. ","type":"Id.CounterDict.CounterDict (Internal.Id a) value -> List.List (Internal.Id a)"},{"name":"insert","comment":" Insert a Id-value pair into a dictionary. Replaces value when there is a collision. ","type":"Internal.Id a -> value -> Id.CounterDict.CounterDict (Internal.Id a) value -> Id.CounterDict.CounterDict (Internal.Id a) value"},{"name":"intersect","comment":" Keep a Id-value pair when its Id appears in the second dictionary. Preference is given to values in the first dictionary. ","type":"Id.CounterDict.CounterDict (Internal.Id a) b -> Internal.Dict o2 (Internal.Id a) c -> Id.CounterDict.CounterDict (Internal.Id a) b"},{"name":"isEmpty","comment":" Determine if a dictionary is empty. ","type":"Id.CounterDict.CounterDict (Internal.Id a) value -> Basics.Bool"},{"name":"leakyDecoder","comment":"\nA 'leaky' JSON Decoder for [`CounterDict`](Id.CounterDict#CounterDict).\nThis decoder will try to succeed to even if parts of json value can't be decoded.\nIf the counter can't be decoded a new counter will be assigned, accounting for all used Ids in the dictionary.\nIf any items in the dictionary have a invalid Id they will be assigned a new Id.\nIf any items in the dictionary cannot be decoded they will be skipped.\n","type":"Json.Decode.Decoder value -> Json.Decode.Decoder (Id.CounterDict.CounterDict (Internal.Id id) value)"},{"name":"map","comment":" Apply a function to all values in a dictionary. ","type":"(Internal.Id a -> b -> c) -> Id.CounterDict.CounterDict (Internal.Id a) b -> Id.CounterDict.CounterDict (Internal.Id a) c"},{"name":"map2","comment":" Apply a function to values that appear in both dictionaries and create a new dictionary with the results, values that don't appear in all dictionaries are skipped. ","type":"(Internal.Id a -> b -> c -> d) -> Id.CounterDict.CounterDict (Internal.Id a) b -> Internal.Dict c2 (Internal.Id a) c -> Id.CounterDict.CounterDict (Internal.Id a) d"},{"name":"map3","comment":" Same as [`Id.Dict.map2`](Id.Dict#map2) but for 3 dictionaries ","type":"(Internal.Id a -> b -> c -> d -> e) -> Id.CounterDict.CounterDict (Internal.Id a) b -> Internal.Dict c2 (Internal.Id a) c -> Internal.Dict c3 (Internal.Id a) d -> Id.CounterDict.CounterDict (Internal.Id a) e"},{"name":"map4","comment":" Same as [`Id.Dict.map2`](Id.Dict#map2) but for 4 dictionaries ","type":"(Internal.Id a -> b -> c -> d -> e -> f) -> Id.CounterDict.CounterDict (Internal.Id a) b -> Internal.Dict c2 (Internal.Id a) c -> Internal.Dict c3 (Internal.Id a) d -> Internal.Dict c4 (Internal.Id a) e -> Id.CounterDict.CounterDict (Internal.Id a) f"},{"name":"member","comment":" Determine if a Id is in a dictionary. ","type":"Internal.Id a -> Id.CounterDict.CounterDict (Internal.Id a) value -> Basics.Bool"},{"name":"partition","comment":"\nPartition a dictionary according to some test.\nThe first dictionary contains all Id-value pairs which passed the test, and the second contains the pairs that did not.\nThe first dictionary retains the Id counter while the second is turned into a [`Id.Dict`](Id.Dict)\n","type":"(Internal.Id a -> value -> Basics.Bool) -> Id.CounterDict.CounterDict (Internal.Id a) value -> ( Id.CounterDict.CounterDict (Internal.Id a) value, Internal.Dict () (Internal.Id a) value )"},{"name":"remove","comment":" Remove a Id-value pair from a dictionary. If the Id is not found, no changes are made. ","type":"Internal.Id a -> Id.CounterDict.CounterDict (Internal.Id a) value -> Id.CounterDict.CounterDict (Internal.Id a) value"},{"name":"singleton","comment":" Create a 'CounterDict' with a single Id-value pair ","type":"Id.Counter.Counter (Internal.Id a) -> value -> ( Internal.Id a, Id.CounterDict.CounterDict (Internal.Id a) value )"},{"name":"size","comment":" Determine the number of Id-value pairs in the dictionary. ","type":"Id.CounterDict.CounterDict (Internal.Id a) value -> Basics.Int"},{"name":"toDict","comment":" Covert a Id.CounterDict into a regular (`Id.Dict`)[Id.Dict#Dict] ","type":"Id.CounterDict.CounterDict (Internal.Id a) value -> Id.Dict.Dict (Internal.Id a) value"},{"name":"toList","comment":" Convert a dictionary into an list of Id-value pairs, sorted by Ids. ","type":"Id.CounterDict.CounterDict (Internal.Id a) value -> List.List ( Internal.Id a, value )"},{"name":"union","comment":" Combine two dictionaries. If there is a collision, preference is given to the first dictionary. ","type":"Internal.Dict counter (Internal.Id a) value -> Id.CounterDict.CounterDict (Internal.Id a) value -> Id.CounterDict.CounterDict (Internal.Id a) value"},{"name":"update","comment":" Update the value of a dictionary for a specific Id with a given function. If the Id is not found, no changes are made. ","type":"Internal.Id a -> (value -> value) -> Id.CounterDict.CounterDict (Internal.Id a) value -> Id.CounterDict.CounterDict (Internal.Id a) value"},{"name":"values","comment":" Get all of the values in a dictionary, in the order of their Ids. ","type":"Id.CounterDict.CounterDict (Internal.Id a) value -> List.List value"}],"binops":[]},{"name":"Id.CounterList","comment":"\n@docs CounterList\n\nMost of the functions in this module are a alias for the same function in [`Id.List`](Id.List), which can handle both 'Id.List' and 'CounterList'\n\n@docs empty, singleton, fromList, fromIdList, fromDict, toList, toDict, getCounter\n@docs isEmpty, length\n@docs member, get, getFrom\n@docs add, addInto, addAt, addList\n@docs insert, insertAt, move\n@docs remove, update\n@docs map, filter, filterMap, foldl, foldr\n@docs ids, values\n@docs partition, diff, intersect, append\n@docs unzip\n\n# Json\n@docs encode, decoder, leakyDecoder\n","unions":[{"name":"CounterList","comment":" A list with a id counter ","args":["id","value"],"cases":[]}],"aliases":[],"values":[{"name":"add","comment":" Add a value to the List and assign it a new [`Id`](Id#Id). ","type":"value -> Id.CounterList.CounterList (Internal.Id a) value -> ( Internal.Id a, Id.CounterList.CounterList (Internal.Id a) value )"},{"name":"addAt","comment":"\nAdd a value to the List, assign it a new [`Id`](Id#Id) and insert it at a given index.\nIndexes lower than 0 will be inserted at index 0.\nIndexes higher than the length of the list will inserted at the end of the list.\n","type":"Basics.Int -> value -> Id.CounterList.CounterList (Internal.Id a) value -> ( Internal.Id a, Id.CounterList.CounterList (Internal.Id a) value )"},{"name":"addInto","comment":" Same as as [`add`](Id.List#add) but only returns the List ","type":"value -> Id.CounterList.CounterList (Internal.Id a) value -> Id.CounterList.CounterList (Internal.Id a) value"},{"name":"addList","comment":" Add a list of values to the List and assign them [`Id`](Id#Id)s ","type":"List.List value -> Id.CounterList.CounterList (Internal.Id a) value -> Id.CounterList.CounterList (Internal.Id a) value"},{"name":"append","comment":" Combine two Lists. If there is a collision, preference is given to the first List. ","type":"Id.List.List (Internal.Id a) value -> Id.CounterList.CounterList (Internal.Id a) value -> Id.CounterList.CounterList (Internal.Id a) value"},{"name":"decoder","comment":" JSON Decoder for [`CounterList`](Id.CounterList#CounterList) ","type":"Json.Decode.Decoder value -> Json.Decode.Decoder (Id.CounterList.CounterList (Internal.Id id) value)"},{"name":"diff","comment":" Keep a Id-value pair when its Id does not appear in the second list. ","type":"Id.CounterList.CounterList id b -> Id.List.List id c -> Id.CounterList.CounterList id b"},{"name":"empty","comment":" Create a empty `CounterList` ","type":"Internal.Counter (Internal.Id a) -> Id.CounterList.CounterList (Internal.Id a) value"},{"name":"encode","comment":" Encode [`CounterList`](Id.CounterList#CounterList) to a JSON value ","type":"(value -> Json.Decode.Value) -> Id.CounterList.CounterList (Internal.Id id) value -> Json.Encode.Value"},{"name":"filter","comment":" Keep only the Id-value pairs that pass the given test. ","type":"(Internal.Id a -> value -> Basics.Bool) -> Id.CounterList.CounterList (Internal.Id a) value -> Id.CounterList.CounterList (Internal.Id a) value"},{"name":"filterMap","comment":" Apply a function to all values in the list and filter out the values that return Nothing. ","type":"(Internal.Id a -> b -> Maybe.Maybe c) -> Id.CounterList.CounterList (Internal.Id a) b -> Id.CounterList.CounterList (Internal.Id a) c"},{"name":"foldl","comment":" Fold over the Id-value pairs in a list from left to right. ","type":"(Internal.Id a -> value -> c -> c) -> c -> Id.CounterList.CounterList (Internal.Id a) value -> c"},{"name":"foldr","comment":" Fold over the Id-value pairs in a list from right to left. ","type":"(Internal.Id a -> value -> c -> c) -> c -> Id.CounterList.CounterList (Internal.Id a) value -> c"},{"name":"fromDict","comment":" Convert a [`Id.CounterDict`](Id.CounterDict#CounterDict) into a  CounterList. ","type":"Id.CounterDict.CounterDict (Internal.Id a) value -> Id.CounterList.CounterList (Internal.Id a) value"},{"name":"fromIdList","comment":"\nCreate a new `CounterList` from a list of Id-value pairs.\nThis removes pairs with duplicate Ids\n","type":"Internal.Counter (Internal.Id a) -> Id.List.List (Internal.Id a) value -> Id.CounterList.CounterList (Internal.Id a) value"},{"name":"fromList","comment":" Create a new `CounterList` from a list of values and assign an [`Id`](Id#Id) to every value ","type":"Internal.Counter (Internal.Id a) -> List.List value -> Id.CounterList.CounterList (Internal.Id a) value"},{"name":"get","comment":" Get the value associated with a Id. If the Id is not found, return Nothing. ","type":"Internal.Id a -> Id.CounterList.CounterList (Internal.Id a) value -> Maybe.Maybe value"},{"name":"getCounter","comment":" Get the counter from a counter list ","type":"a -> Id.CounterList.CounterList (Internal.Id a) value -> Internal.Counter (Internal.Id a)"},{"name":"getFrom","comment":" Same as [get](Id.List#get) but with the arguments swapped, useful for pipelines. ","type":"Id.CounterList.CounterList (Internal.Id a) value -> Internal.Id a -> Maybe.Maybe value"},{"name":"ids","comment":" Get all of the Ids in a list, sorted from lowest to highest. ","type":"Id.CounterList.CounterList (Internal.Id a) value -> List.List (Internal.Id a)"},{"name":"insert","comment":"\nInsert a Id-value pair into a list.\nIf there is a existing pair with the same Id if will be replaced.\nIf there isn't a existing pair the pair will be inserted at the start of the list.\n","type":"Internal.Id a -> value -> Id.CounterList.CounterList (Internal.Id a) value -> Id.CounterList.CounterList (Internal.Id a) value"},{"name":"insertAt","comment":"\nInsert a Id-value pair into a given index into a Id.List.\nThis will remove any existing value with the same Id.\nIndexes lower than 0 will be inserted at index 0.\nIndexes higher than the length of the list will inserted at the end of the list.\n","type":"Basics.Int -> Internal.Id a -> value -> Id.CounterList.CounterList (Internal.Id a) value -> Id.CounterList.CounterList (Internal.Id a) value"},{"name":"intersect","comment":" Keep a Id-value pair when its Id appears in the second list. Preference is given to values in the first list. ","type":"Id.CounterList.CounterList id b -> Id.List.List id c -> Id.CounterList.CounterList id b"},{"name":"isEmpty","comment":" Determine if a list is empty. ","type":"Id.CounterList.CounterList (Internal.Id a) value -> Basics.Bool"},{"name":"leakyDecoder","comment":"\nA 'leaky' JSON Decoder for [`CounterList`](Id.CounterList#CounterList).\nThis decoder will try to succeed to even if parts of json value can't be decoded.\nIf the counter can't be decoded a new counter will be assigned, accounting for all used Ids in the list.\nIf any items in the list have a invalid Id they will be assigned a new Id.\nIf any items in the list cannot be decoded they will be skipped.\n","type":"Json.Decode.Decoder value -> Json.Decode.Decoder (Id.CounterList.CounterList (Internal.Id id) value)"},{"name":"length","comment":" Determine the number of Id-value pairs in the list. ","type":"Id.CounterList.CounterList (Internal.Id a) value -> Basics.Int"},{"name":"map","comment":" Apply a function to all values in a list. ","type":"(Internal.Id a -> b -> c) -> Id.CounterList.CounterList (Internal.Id a) b -> Id.CounterList.CounterList (Internal.Id a) c"},{"name":"member","comment":" Determine if a Id is in a list. ","type":"Internal.Id a -> Id.CounterList.CounterList (Internal.Id a) value -> Basics.Bool"},{"name":"move","comment":" Move a existing value to a new index. Does nothing if the item is not present. ","type":"Internal.Id a -> Basics.Int -> Id.CounterList.CounterList (Internal.Id a) value -> Id.CounterList.CounterList (Internal.Id a) value"},{"name":"partition","comment":"\nPartition a list according to some test.\nThe first list contains all Id-value pairs which passed the test, and the second contains the pairs that did not.\nThe first list retains the Id counter while the second is turned into a [`Id.List`](Id.List)\n","type":"(id -> value -> Basics.Bool) -> Id.CounterList.CounterList id value -> ( Id.CounterList.CounterList id value, Id.List.List id value )"},{"name":"remove","comment":" Remove a Id-value pair from a list. If the Id is not found, no changes are made. ","type":"Internal.Id a -> Id.CounterList.CounterList (Internal.Id a) value -> Id.CounterList.CounterList (Internal.Id a) value"},{"name":"singleton","comment":" Create a 'CounterList' with a single Id-value pair ","type":"Internal.Counter (Internal.Id a) -> value -> ( Internal.Id a, Id.CounterList.CounterList (Internal.Id a) value )"},{"name":"toDict","comment":" Convert a CounterList into a [`Id.CounterDict`](Id.CounterDict#CounterDict). ","type":"Id.CounterList.CounterList (Internal.Id a) value -> Id.CounterDict.CounterDict (Internal.Id a) value"},{"name":"toList","comment":" Convert a CounterList into a [`Id.List`](Id.List#List). ","type":"Id.CounterList.CounterList id value -> Id.List.List id value"},{"name":"unzip","comment":" Decompose a list of tuples into a tuple of lists. ","type":"Id.CounterList.CounterList id ( a, b ) -> ( Id.CounterList.CounterList id a, Id.List.List id b )"},{"name":"update","comment":" Update the value of a list for a specific Id with a given function. If the Id is not found, no changes are made. ","type":"Internal.Id a -> (value -> value) -> Id.CounterList.CounterList (Internal.Id a) value -> Id.CounterList.CounterList (Internal.Id a) value"},{"name":"values","comment":" Get all of the values in a list, in the order of their Ids. ","type":"Id.CounterList.CounterList (Internal.Id a) value -> List.List value"}],"binops":[]},{"name":"Id.Dict","comment":"\n@docs Dict, Dict_\n\n@docs empty, singleton, fromList, toList\n@docs isEmpty, size\n@docs member, get, getFrom\n@docs insert, remove, update\n@docs accountForIds\n@docs map, filter, filterMap, fold\n@docs ids, values\n@docs partition\n@docs diff, intersect, union\n@docs map2, map3, map4\n\n# Json\n@docs encode, decoder, leakyDecoder\n","unions":[],"aliases":[{"name":"Dict","comment":" A [`Dict`](https://package.elm-lang.org/packages/elm/core/latest/Dict#Dict) for [`Id`](Id#Id)-value pairs ","args":["id","value"],"type":"Id.Dict.Dict_ () id value"},{"name":"Dict_","comment":" A type that can represent [`Id.Dict`](Id.Dict#Dict) and [`Id.CounterDict`](Id.CounterDict#CounterDict) ","args":["counter","id","value"],"type":"Internal.Dict counter id value"}],"values":[{"name":"accountForIds","comment":" Same as [`Id.Counter.accountForIds`](Id.Counter#accountForIds) but can be used with a [`Dict`](Id.Dict#Dict) ","type":"Id.Dict.Dict_ counter (Internal.Id a) value -> Id.Counter.Counter (Internal.Id a) -> Id.Counter.Counter (Internal.Id a)"},{"name":"decoder","comment":" JSON Decoder for [`Dict`](Id.Dict#Dict) ","type":"Json.Decode.Decoder value -> Json.Decode.Decoder (Id.Dict.Dict id value)"},{"name":"diff","comment":" Keep a Id-value pair when its Id does not appear in the second dictionary. ","type":"Id.Dict.Dict_ counter1 (Internal.Id a) b -> Id.Dict.Dict_ counter2 (Internal.Id a) c -> Id.Dict.Dict_ counter1 (Internal.Id a) b"},{"name":"empty","comment":" Create a empty [`Dict`](Id.Dict#Dict) ","type":"Id.Dict.Dict (Internal.Id a) value"},{"name":"encode","comment":" Encode a [`Dict`](Id.Dict#Dict) to a JSON value ","type":"(value -> Json.Encode.Value) -> Id.Dict.Dict id value -> Json.Encode.Value"},{"name":"filter","comment":" Keep only the Id-value pairs that pass the given test. ","type":"(Internal.Id a -> value -> Basics.Bool) -> Id.Dict.Dict_ counter (Internal.Id a) value -> Id.Dict.Dict_ counter (Internal.Id a) value"},{"name":"filterMap","comment":" Apply a function to all values in the dictionary and filter out the values that return Nothing. ","type":"(Internal.Id a -> b -> Maybe.Maybe c) -> Id.Dict.Dict_ counter (Internal.Id a) b -> Id.Dict.Dict_ counter (Internal.Id a) c"},{"name":"fold","comment":" Fold over the Id-value pairs in a dictionary from lowest Id to highest Id. ","type":"(Internal.Id a -> value -> c -> c) -> c -> Id.Dict.Dict_ counter (Internal.Id a) value -> c"},{"name":"fromList","comment":" Convert an list of Id-value pairs into a dictionary. ","type":"List.List ( Internal.Id a, value ) -> Id.Dict.Dict (Internal.Id a) value"},{"name":"get","comment":" Get the value associated with a Id. If the Id is not found, return Nothing. ","type":"Internal.Id a -> Id.Dict.Dict_ counter (Internal.Id a) value -> Maybe.Maybe value"},{"name":"getFrom","comment":" Same as [get](Id.Dict#get) but with the arguments swapped, useful for pipelines. ","type":"Id.Dict.Dict_ counter (Internal.Id a) value -> Internal.Id a -> Maybe.Maybe value"},{"name":"ids","comment":" Get all of the Ids in a dictionary, sorted from lowest to highest. ","type":"Id.Dict.Dict_ counter (Internal.Id a) value -> List.List (Internal.Id a)"},{"name":"insert","comment":" Insert a Id-value pair into a dictionary. Replaces value when there is a collision. ","type":"Internal.Id a -> value -> Id.Dict.Dict_ counter (Internal.Id a) value -> Id.Dict.Dict_ counter (Internal.Id a) value"},{"name":"intersect","comment":" Keep a Id-value pair when its Id appears in the second dictionary. Preference is given to values in the first dictionary. ","type":"Id.Dict.Dict_ counter1 (Internal.Id a) b -> Id.Dict.Dict_ counter2 (Internal.Id a) c -> Id.Dict.Dict_ counter1 (Internal.Id a) b"},{"name":"isEmpty","comment":" Determine if a dictionary is empty. ","type":"Id.Dict.Dict_ counter (Internal.Id a) value -> Basics.Bool"},{"name":"leakyDecoder","comment":"\nA 'leaky' JSON Decoder for [`Dict`](Id.Dict#Dict).\nIf any items in the dictionary cannot be decoded they will be skipped instead of failing the entire decoder.\n","type":"Json.Decode.Decoder value -> Json.Decode.Decoder (Id.Dict.Dict (Internal.Id id) value)"},{"name":"map","comment":" Apply a function to all values in a dictionary. ","type":"(Internal.Id a -> b -> c) -> Id.Dict.Dict_ counter (Internal.Id a) b -> Id.Dict.Dict_ counter (Internal.Id a) c"},{"name":"map2","comment":" Apply a function to values that appear in both dictionaries and create a new dictionary with the results, values that don't appear in all dictionaries are skipped. ","type":"(Internal.Id a -> b -> c -> d) -> Id.Dict.Dict_ c1 (Internal.Id a) b -> Id.Dict.Dict_ c2 (Internal.Id a) c -> Id.Dict.Dict_ c1 (Internal.Id a) d"},{"name":"map3","comment":" Same as [`Id.Dict.map2`](Id.Dict#map2) but for 3 dictionaries ","type":"(Internal.Id a -> b -> c -> d -> e) -> Id.Dict.Dict_ c1 (Internal.Id a) b -> Id.Dict.Dict_ c2 (Internal.Id a) c -> Id.Dict.Dict_ c3 (Internal.Id a) d -> Id.Dict.Dict_ c1 (Internal.Id a) e"},{"name":"map4","comment":" Same as [`Id.Dict.map2`](Id.Dict#map2) but for 4 dictionaries ","type":"(Internal.Id a -> b -> c -> d -> e -> f) -> Id.Dict.Dict_ c1 (Internal.Id a) b -> Id.Dict.Dict_ c2 (Internal.Id a) c -> Id.Dict.Dict_ c3 (Internal.Id a) d -> Id.Dict.Dict_ c4 (Internal.Id a) e -> Id.Dict.Dict_ c1 (Internal.Id a) f"},{"name":"member","comment":" Determine if a Id is in a dictionary. ","type":"Internal.Id a -> Id.Dict.Dict_ counter (Internal.Id a) value -> Basics.Bool"},{"name":"partition","comment":" Partition a dictionary according to some test. The first dictionary contains all Id-value pairs which passed the test, and the second contains the pairs that did not. ","type":"(Internal.Id a -> value -> Basics.Bool) -> Id.Dict.Dict_ counter (Internal.Id a) value -> ( Id.Dict.Dict_ counter (Internal.Id a) value, Id.Dict.Dict (Internal.Id a) value )"},{"name":"remove","comment":" Remove a Id-value pair from a dictionary. If the Id is not found, no changes are made. ","type":"Internal.Id a -> Id.Dict.Dict_ counter (Internal.Id a) value -> Id.Dict.Dict_ counter (Internal.Id a) value"},{"name":"singleton","comment":" Create a dictionary with a single Id-value pair ","type":"Internal.Id a -> value -> Id.Dict.Dict (Internal.Id a) value"},{"name":"size","comment":" Determine the number of Id-value pairs in the dictionary. ","type":"Id.Dict.Dict_ counter (Internal.Id a) value -> Basics.Int"},{"name":"toList","comment":" Convert a dictionary into an list of Id-value pairs, sorted by Ids. ","type":"Id.Dict.Dict_ counter (Internal.Id a) value -> List.List ( Internal.Id a, value )"},{"name":"union","comment":" Combine two dictionaries. If there is a collision, preference is given to the first dictionary. ","type":"Id.Dict.Dict_ counter1 (Internal.Id a) value -> Id.Dict.Dict_ counter2 (Internal.Id a) value -> Id.Dict.Dict (Internal.Id a) value"},{"name":"update","comment":" Update the value of a dictionary for a specific Id with a given function. If the Id is not found, no changes are made. ","type":"Internal.Id a -> (value -> value) -> Id.Dict.Dict_ counter (Internal.Id a) value -> Id.Dict.Dict_ counter (Internal.Id a) value"},{"name":"values","comment":" Get all of the values in a dictionary, in the order of their Ids. ","type":"Id.Dict.Dict_ counter (Internal.Id a) value -> List.List value"}],"binops":[]},{"name":"Id.List","comment":"\n@docs List\n\n@docs empty, singleton\n@docs isEmpty, length\n@docs member, get, getFrom\n@docs insert, insertAt, move, remove, update\n@docs accountForIds\n@docs map, removeDuplicateIds, filter, filterMap, foldl, foldr\n@docs ids, values\n@docs partition\n@docs diff, intersect, append, unzip\n@docs map2, map3, map4\n\n# Json\n@docs encode, decoder, leakyDecoder\n","unions":[],"aliases":[{"name":"List","comment":" A ordered list of Id-value pairs, is constructed as a List of Id-value Tuples. ","args":["id","value"],"type":"Core.List ( id, value )"}],"values":[{"name":"accountForIds","comment":" Same as [`Id.Counter.accountForIds`](Id.Counter#accountForIds) but can be used with a [`Id.List`](Id.List#List) ","type":"Id.List.List (Internal.Id a) value -> Id.Counter.Counter (Internal.Id a) -> Id.Counter.Counter (Internal.Id a)"},{"name":"append","comment":" Combine two Lists. If there is a collision, preference is given to the first List. ","type":"Id.List.List id value -> Id.List.List id value -> Id.List.List id value"},{"name":"decoder","comment":" JSON Decoder for [`List`](Id.List#List) ","type":"Json.Decode.Decoder value -> Json.Decode.Decoder (Id.List.List (Internal.Id id) value)"},{"name":"diff","comment":" Keep a Id-value pair when its Id does not appear in the second List. ","type":"Id.List.List id b -> Id.List.List id c -> Id.List.List id b"},{"name":"empty","comment":" Create a empty [`List`](Id.List#List) ","type":"Id.List.List id value"},{"name":"encode","comment":" Encode a [`List`](Id.List#List) to a JSON value ","type":"(value -> Json.Encode.Value) -> Id.List.List (Internal.Id id) value -> Json.Encode.Value"},{"name":"filter","comment":" Keep only the Id-value pairs that pass the given test. ","type":"(id -> value -> Basics.Bool) -> Id.List.List id value -> Id.List.List id value"},{"name":"filterMap","comment":" Apply a function to all values in the List and filter out the values that return Nothing. ","type":"(id -> b -> Maybe.Maybe c) -> Id.List.List id b -> Id.List.List id c"},{"name":"foldl","comment":" Reduce the list from the left. ","type":"(id -> value -> c -> c) -> c -> Id.List.List id value -> c"},{"name":"foldr","comment":" Reduce the list from the left. ","type":"(id -> value -> c -> c) -> c -> Id.List.List id value -> c"},{"name":"get","comment":" Get the value associated with a Id. If the Id is not found, return Nothing. ","type":"id -> Id.List.List id value -> Maybe.Maybe value"},{"name":"getFrom","comment":" Same as [get](Id.List#get) but with the arguments swapped, useful for pipelines. ","type":"Id.List.List id value -> id -> Maybe.Maybe value"},{"name":"ids","comment":" Get all of the Ids in the List. ","type":"Id.List.List id value -> Core.List id"},{"name":"insert","comment":"\nInsert a Id-value pair into a Id.List.\nIf there is a existing pair with the same Id if will be replaced.\nIf there isn't a existing pair the pair will be inserted at the start of the list.\n","type":"id -> value -> Id.List.List id value -> Id.List.List id value"},{"name":"insertAt","comment":"\nInsert a Id-value pair into a given index into a Id.List.\nThis will remove any existing value with the same Id.\nIndexes lower than 0 will be inserted at index 0.\nIndexes higher than the length of the list will inserted at the end of the list.\n","type":"Basics.Int -> id -> value -> Id.List.List id value -> Id.List.List id value"},{"name":"intersect","comment":" Keep a Id-value pair when its Id appears in the second List. Preference is given to values in the first List. ","type":"Id.List.List id b -> Id.List.List id c -> Id.List.List id b"},{"name":"isEmpty","comment":" Determine if a Id.List is empty. ","type":"Id.List.List id value -> Basics.Bool"},{"name":"leakyDecoder","comment":"\nA 'leaky' JSON Decoder for [`List`](Id.List#List).\nIf any items in the list cannot be decoded they will be skipped instead of failing the entire decoder.\n","type":"Json.Decode.Decoder value -> Json.Decode.Decoder (Id.List.List (Internal.Id id) value)"},{"name":"length","comment":" Determine the number of Id-value pairs in the List. ","type":"Id.List.List id value -> Basics.Int"},{"name":"map","comment":" Apply a function to all values in a Id.List. ","type":"(id -> b -> c) -> Id.List.List id b -> Id.List.List id c"},{"name":"map2","comment":" Apply a function to values that appear in both Lists and create a new List with the results, values that don't appear in all Lists are skipped. ","type":"(id -> a -> b -> c) -> Id.List.List id a -> Id.List.List id b -> Id.List.List id c"},{"name":"map3","comment":" Same as [`Id.List.map2`](Id.List#map2) but for 3 Lists ","type":"(id -> a -> b -> c -> d) -> Id.List.List id a -> Id.List.List id b -> Id.List.List id c -> Id.List.List id d"},{"name":"map4","comment":" Same as [`Id.List.map2`](Id.List#map2) but for 4 Lists ","type":"(id -> a -> b -> c -> d -> e) -> Id.List.List id a -> Id.List.List id b -> Id.List.List id c -> Id.List.List id d -> Id.List.List id e"},{"name":"member","comment":" Determine if a Id is in a Id.List. ","type":"id -> Id.List.List id value -> Basics.Bool"},{"name":"move","comment":" Move a existing value to a new index. Does nothing if the item is not present. ","type":"id -> Basics.Int -> Id.List.List id value -> Id.List.List id value"},{"name":"partition","comment":" Partition a Id.List according to some test. The first List contains all Id-value pairs which passed the test, and the second contains the pairs that did not. ","type":"(id -> value -> Basics.Bool) -> Id.List.List id value -> ( Id.List.List id value, Id.List.List id value )"},{"name":"remove","comment":" Remove a Id-value pair from a Id.List. If the Id is not found, no changes are made. ","type":"id -> Id.List.List id value -> Id.List.List id value"},{"name":"removeDuplicateIds","comment":" Removes pairs that have a duplicate Id. Retains the last pair. ","type":"Core.List ( id, value ) -> Id.List.List id value"},{"name":"singleton","comment":" Create a Id.List with a single Id-value pair ","type":"id -> value -> Id.List.List id value"},{"name":"unzip","comment":" Decompose a list of tuples into a tuple of lists. ","type":"Id.List.List id ( a, b ) -> ( Id.List.List id a, Id.List.List id b )"},{"name":"update","comment":" Update the value of a Id.List for a specific Id with a given function. If the Id is not found, no changes are made. ","type":"id -> (value -> value) -> Id.List.List id value -> Id.List.List id value"},{"name":"values","comment":" Get all of the values in the List. ","type":"Id.List.List id value -> Core.List value"}],"binops":[]},{"name":"Id.Set","comment":"\n@docs Set, Set_\n\n@docs empty, singleton, fromList, fromDict, fromIdList, fromCounterList, toList\n\n@docs isEmpty, size, member\n\n@docs insert, remove\n\n@docs accountForIds\n\n@docs filter, fold\n\n@docs partition, diff, intersect, union\n\n# Json\n@docs encode, decoder, leakyDecoder\n","unions":[],"aliases":[{"name":"Set","comment":" A set type for Ids, is equal to a [`Id.Dict`](Id.Dict#Dict) with empty tuples as values ","args":["id"],"type":"Id.Dict.Dict id ()"},{"name":"Set_","comment":" A type that can represent [`Id.Set`](Id.Set#Set) and [`Id.CounterDict id ()`](Id.CounterDict#CounterDict) ","args":["counter","id"],"type":"Id.Dict.Dict_ counter id ()"}],"values":[{"name":"accountForIds","comment":" Same as [`Id.Counter.accountForIds`](Id.Counter#accountForIds) but can be used with a [`Set`](Id.Set#Set) ","type":"Id.Set.Set_ counter (Internal.Id a) -> Id.Counter.Counter (Internal.Id a) -> Id.Counter.Counter (Internal.Id a)"},{"name":"decoder","comment":" JSON Decoder for [`Set`](Id.Set#Set) ","type":"Json.Decode.Decoder (Id.Set.Set id)"},{"name":"diff","comment":" Get the difference between the first set and the second. Keeps Ids that do not appear in the second set. ","type":"Id.Set.Set_ counter1 (Internal.Id a) -> Id.Dict.Dict_ counter2 (Internal.Id a) b -> Id.Set.Set_ counter1 (Internal.Id a)"},{"name":"empty","comment":" Create a empty [`Set`](Id.Set#Set) ","type":"Id.Set.Set (Internal.Id a)"},{"name":"encode","comment":" Encode [`Set`](Id.Set#Set) to a JSON value ","type":"Id.Set.Set id -> Json.Encode.Value"},{"name":"filter","comment":" Keep only the Ids that pass the given test. ","type":"(Internal.Id a -> Basics.Bool) -> Id.Set.Set_ counter (Internal.Id a) -> Id.Set.Set_ counter (Internal.Id a)"},{"name":"fold","comment":" Fold over the Ids in a set from lowest Id to highest Id. ","type":"(Internal.Id a -> c -> c) -> c -> Id.Set.Set_ counter (Internal.Id a) -> c"},{"name":"fromCounterList","comment":" Create a set with the Ids from a [`Id.CounterList`](Id.CounterList#CounterList) ","type":"Id.CounterList.CounterList (Internal.Id a) value -> Id.Set.Set (Internal.Id a)"},{"name":"fromDict","comment":" Create a set with the Ids from a [`Id.Dict`](Id.Dict#Dict) ","type":"Id.Dict.Dict_ counter (Internal.Id a) value -> Id.Set.Set (Internal.Id a)"},{"name":"fromIdList","comment":" Create a set with the Ids from a [`Id.List`](Id.List#List) ","type":"Id.List.List (Internal.Id a) value -> Id.Set.Set (Internal.Id a)"},{"name":"fromList","comment":" Create a set from a list of Ids ","type":"List.List (Internal.Id a) -> Id.Set.Set (Internal.Id a)"},{"name":"insert","comment":" Insert a Id into a set. ","type":"Internal.Id a -> Id.Set.Set_ counter (Internal.Id a) -> Id.Set.Set_ counter (Internal.Id a)"},{"name":"intersect","comment":" Get the intersection of two sets. Keeps Ids that appear in both sets. ","type":"Id.Set.Set_ counter1 (Internal.Id a) -> Id.Dict.Dict_ counter2 (Internal.Id a) b -> Id.Set.Set_ counter1 (Internal.Id a)"},{"name":"isEmpty","comment":" Determine if a set is empty. ","type":"Id.Set.Set_ counter (Internal.Id a) -> Basics.Bool"},{"name":"leakyDecoder","comment":"\nA 'leaky' JSON Decoder for [`Set`](Id.Set#Set).\nAny invalid Ids will be skipped instead of failing the entire decoder.\n","type":"Json.Decode.Decoder (Id.Set.Set id)"},{"name":"member","comment":" Determine if a Id is in a set. ","type":"Internal.Id a -> Id.Set.Set_ counter (Internal.Id a) -> Basics.Bool"},{"name":"partition","comment":" Partition a set according to some test. The first set contains all Ids which passed the test, and the second contains the Ids that did not. ","type":"(Internal.Id a -> Basics.Bool) -> Id.Set.Set_ counter (Internal.Id a) -> ( Id.Set.Set_ counter (Internal.Id a), Id.Set.Set (Internal.Id a) )"},{"name":"remove","comment":" Remove a Id from a set. If the Id is not found, no changes are made. ","type":"Internal.Id a -> Id.Set.Set_ counter (Internal.Id a) -> Id.Set.Set_ counter (Internal.Id a)"},{"name":"singleton","comment":" Create a set with a single Id ","type":"Internal.Id a -> Id.Set.Set (Internal.Id a)"},{"name":"size","comment":" Determine the number of Ids in the set. ","type":"Id.Set.Set_ counter (Internal.Id a) -> Basics.Int"},{"name":"toList","comment":" Get all of the Ids in a set, sorted from lowest to highest. ","type":"Id.Set.Set_ counter (Internal.Id a) -> List.List (Internal.Id a)"},{"name":"union","comment":" Get the union of two sets. Keep all Ids. ","type":"Id.Dict.Dict_ counter1 (Internal.Id a) b -> Id.Set.Set_ counter2 (Internal.Id a) -> Id.Set.Set_ counter2 (Internal.Id a)"}],"binops":[]}]