module Model.Payers ( Payers , ExceedingPayer , payersDecoder , updatePayers , getOrderedExceedingPayers ) where import Json.Decode as Json exposing (..) import Dict exposing (..) import List import Maybe type alias Payers = Dict String Int payersDecoder : Decoder Payers payersDecoder = Json.map Dict.fromList (list payerDecoder) payerDecoder : Decoder (String, Int) payerDecoder = object2 (,) ("userName" := string) ("totalPayment" := int) updatePayers : Payers -> String -> Int -> Payers updatePayers payers userName amountDiff = Dict.update userName (\mbAmount -> case mbAmount of Just amount -> Just (amount + amountDiff) Nothing -> Nothing ) payers type alias ExceedingPayer = { userName : String , amount : Int } getOrderedExceedingPayers : Payers -> List ExceedingPayer getOrderedExceedingPayers payers = let orderedPayers = Dict.toList payers |> List.map (\(userName, amount) -> ExceedingPayer userName amount) |> List.sortBy .amount maybeMinAmount = List.head orderedPayers |> Maybe.map .amount in case maybeMinAmount of Just minAmount -> orderedPayers |> List.map (\payer -> { payer | amount <- payer.amount - minAmount }) |> List.filter (\payer -> payer.amount /= 0) |> List.reverse Nothing -> []