--{-# LANGUAGE TupleSections #-} module Dodge.Combine ( combineList, ) where import Data.Bifunctor import Data.List (sortOn) import qualified Data.Map.Strict as M import Dodge.Base.You import Dodge.Combine.Trie import Dodge.Data.Combine import Dodge.Data.Universe import Dodge.Item.Display import Dodge.Item.InventoryColor import qualified IntMapHelp as IM import SimpleTrie invertInventoryToMap :: IM.IntMap Item -> M.Map ItemType [Int] invertInventoryToMap = IM.foldrWithKey (\k it -> M.insertWith (++) (_itType it) [k]) mempty groupSplitItemAmounts :: M.Map ItemType [Int] -> [((ItAmount, ItemType), [Int])] groupSplitItemAmounts = M.foldrWithKey f [] where f ibt is = (++) [((fromIntegral i, ibt), take i is) | i <- [1 .. length is]] flatLookupItems :: IM.IntMap Item -> [([[Int]], Item)] flatLookupItems = flip multiLookupTrieI combinationsTrie . sortOn fst . groupSplitItemAmounts . invertInventoryToMap combineItemListYouX :: World -> [([Int], Item)] combineItemListYouX = map (first concat) . flatLookupItems . yourInv combineList :: World -> [SelectionItem CombinableItem] combineList = map f . combineItemListYouX where f (is, itm) = SelectionItem { _siPictures = basicItemDisplay itm , _siHeight = _itInvSize itm , _siIsSelectable = True , _siColor = itemInvColor itm , _siOffX = 0 , _siPayload = CombinableItem is itm [] }