Files
loop/src/Dodge/Combine.hs
T
2025-09-19 19:56:12 +01:00

61 lines
1.8 KiB
Haskell

--{-# LANGUAGE TupleSections #-}
module Dodge.Combine (combineList) where
import NewInt
import Dodge.Data.CombAmount
import Dodge.Item.InvSize
import Dodge.Item.Grammar
import Data.Bifunctor
import Data.Foldable
import Data.List (sort, sortOn)
import qualified Data.Map.Strict as M
import Dodge.Base.You
import Dodge.Combine.Combinations
import Dodge.Data.Combine
import Dodge.Data.Universe
import Dodge.Item.Display
import Dodge.Item.InventoryColor
import qualified IntMapHelp as IM
import SimpleTrie
combineList :: World -> [SelectionItem CombItem]
combineList = map f . combineItemListYouX
where
f (is, itm) =
SelItem
{ _siPictures = basicItemDisplay itm
, _siHeight = itInvHeight itm
, _siWidth = 15
, _siIsSelectable = True
, _siColor = itemInvColor $ baseCI itm
, _siOffX = 2
, _siPayload = Just $ CombItem is itm
}
combineItemListYouX :: World -> [([Int], Item)]
combineItemListYouX = map (first concat) . flatLookupItems . _unNIntMap . yourInv
flatLookupItems :: IM.IntMap Item -> [([[Int]], Item)]
flatLookupItems =
flip multiLookupTrieI combinationsTrie . sortOn fst . groupSplitItemAmounts
. invertInventoryToMap
combinationsTrie :: Trie (CombAmount, ItemType) Item
{-# INLINE combinationsTrie #-}
combinationsTrie =
foldl'
(flip $ uncurry insertInTrie . first sort)
emptyTrie
itemCombinations
groupSplitItemAmounts :: M.Map ItemType [Int] -> [((CombAmount, ItemType), [Int])]
groupSplitItemAmounts = M.foldMapWithKey f
where
f ibt is = [((fromIntegral i, ibt), take i is) | i <- [1 .. length is]]
invertInventoryToMap :: IM.IntMap Item -> M.Map ItemType [Int]
invertInventoryToMap =
IM.foldrWithKey
(\k it -> M.insertWith (++) (_itType it) [k])
mempty