aboutsummaryrefslogtreecommitdiff
path: root/src/client/Model/Payers.elm
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/Model/Payers.elm')
-rw-r--r--src/client/Model/Payers.elm57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/client/Model/Payers.elm b/src/client/Model/Payers.elm
new file mode 100644
index 0000000..6550eaa
--- /dev/null
+++ b/src/client/Model/Payers.elm
@@ -0,0 +1,57 @@
+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 ->
+ []