module Model.PaymentCategory exposing ( PaymentCategories , paymentCategoriesDecoder , search , isCategoryUnused , set , update ) import Dict exposing (Dict) import Json.Decode as Decode exposing (Decoder) import Model.Category exposing (CategoryId, categoryIdDecoder) import Utils.Json as Json import Utils.Search as Search type alias PaymentCategories = List PaymentCategory type alias PaymentCategory = { name : String , category : CategoryId } paymentCategoriesDecoder : Decoder PaymentCategories paymentCategoriesDecoder = Decode.list <| Decode.map2 PaymentCategory (Decode.field "name" Decode.string) (Decode.field "category" categoryIdDecoder) search : String -> PaymentCategories -> Maybe CategoryId search paymentName paymentCategories = paymentCategories |> List.filter (\pc -> Search.format pc.name == Search.format paymentName) |> List.head |> Maybe.map .category isCategoryUnused : CategoryId -> PaymentCategories -> Bool isCategoryUnused category paymentCategories = paymentCategories |> List.filter ((==) category << .category) |> List.isEmpty set : String -> CategoryId -> PaymentCategories -> PaymentCategories set name category paymentCategories = update name name category paymentCategories update : String -> String -> CategoryId -> PaymentCategories -> PaymentCategories update oldName newName category paymentCategories = { name = newName, category = category } :: List.filter (\pc -> not <| Search.format pc.name == Search.format oldName) paymentCategories