diff --git a/ghcidOutput b/ghcidOutput index 707798d18..5ccbcef78 100644 --- a/ghcidOutput +++ b/ghcidOutput @@ -1 +1 @@ -All good (604 modules, at 10:01:12) +All good (604 modules, at 10:33:02) diff --git a/src/Dodge/Combine.hs b/src/Dodge/Combine.hs index c1c1b7ec4..64a4d3425 100644 --- a/src/Dodge/Combine.hs +++ b/src/Dodge/Combine.hs @@ -3,39 +3,18 @@ module Dodge.Combine ( combineList, ) where -import Dodge.Combine.Combinations import Data.Bifunctor -import Data.List (sortOn) +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 -import Data.Foldable -import Data.List (sort) - -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 [] -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 @@ -50,6 +29,14 @@ combineList = map f . combineItemListYouX , _siPayload = CombinableItem is itm [] } +combineItemListYouX :: World -> [([Int], Item)] +combineItemListYouX = map (first concat) . flatLookupItems . yourInv + +flatLookupItems :: IM.IntMap Item -> [([[Int]], Item)] +flatLookupItems = + flip multiLookupTrieI combinationsTrie . sortOn fst . groupSplitItemAmounts + . invertInventoryToMap + combinationsTrie :: Trie (ItAmount, ItemType) Item {-# INLINE combinationsTrie #-} combinationsTrie = @@ -57,3 +44,14 @@ combinationsTrie = (flip $ uncurry insertInTrie . first sort) emptyTrie itemCombinations + +groupSplitItemAmounts :: M.Map ItemType [Int] -> [((ItAmount, 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 diff --git a/src/IntMapHelp.hs b/src/IntMapHelp.hs index 57544d26a..080c8a1e9 100644 --- a/src/IntMapHelp.hs +++ b/src/IntMapHelp.hs @@ -18,11 +18,14 @@ module IntMapHelp cycleGT, cycleLT, + + invertIntMap, ) where import Control.Applicative import Data.Aeson import Data.IntMap.Strict +import qualified Data.Map.Strict as M import GHC.Generics import LensHelp @@ -94,3 +97,9 @@ cycleGT i m = lookupGT i m <|> lookupMin m cycleLT :: Int -> IntMap a -> Maybe (Int, a) cycleLT i m = lookupLT i m <|> lookupMax m + +invertIntMap :: Ord a => IntMap a -> M.Map a [Int] +invertIntMap = foldrWithKey + (\k xs -> M.insertWith (++) xs [k]) + mempty + diff --git a/tags b/tags index 97411abb9..4fd255b86 100644 --- a/tags +++ b/tags @@ -4705,13 +4705,14 @@ colorSH src/Shape.hs 233;" f combinationsDotGraph src/Dodge/Combine/Graph.hs 85;" f combinationsGraph src/Dodge/Combine/Graph.hs 66;" f combinationsOf src/Multiset.hs 40;" f +combinationsTrie src/Dodge/Combine.hs 51;" f combinationsTrie src/Dodge/Combine/Trie.hs 19;" f combineAwareness src/Dodge/Creature/AlertLevel.hs 33;" f combineAwareness src/Dodge/Creature/Perception.hs 109;" f combineFloors src/Dodge/Room/Procedural.hs 171;" f combineInventoryExtra src/Dodge/Render/HUD.hs 203;" f -combineItemListYouX src/Dodge/Combine.hs 34;" f -combineList src/Dodge/Combine.hs 37;" f +combineItemListYouX src/Dodge/Combine.hs 35;" f +combineList src/Dodge/Combine.hs 38;" f combineRooms src/Dodge/Room/Procedural.hs 151;" f combineS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 344;" f combineTree src/Dodge/Tree/Compose.hs 66;" f @@ -4856,9 +4857,9 @@ cutWallsWithPoints src/Dodge/LevelGen/StaticWalls.hs 112;" f cyan src/Color.hs 18;" f cycleDownEnum src/Dodge/Menu/OptionType.hs 27;" f cycleEnum src/Dodge/Menu/OptionType.hs 22;" f -cycleGT src/IntMapHelp.hs 92;" f +cycleGT src/IntMapHelp.hs 95;" f cycleL src/DoubleStack.hs 28;" f -cycleLT src/IntMapHelp.hs 95;" f +cycleLT src/IntMapHelp.hs 98;" f cycleOptions src/Dodge/Menu/Option.hs 84;" f cycleR src/DoubleStack.hs 32;" f cylinderIndices src/Shader/Poke.hs 374;" f @@ -5392,7 +5393,7 @@ findBlips src/Dodge/RadarSweep.hs 44;" f findBoundDists src/Dodge/Update/Camera.hs 239;" f findClosePoint src/Dodge/LevelGen/StaticWalls.hs 155;" f findClosePoint src/Dodge/LevelGen/StaticWalls/Deprecated.hs 74;" f -findIndex src/IntMapHelp.hs 84;" f +findIndex src/IntMapHelp.hs 87;" f findItemSlot src/Dodge/Inventory/CheckSlots.hs 26;" f findReverseEdge src/Polyhedra.hs 49;" f findReverseEdgeList src/Polyhedra.hs 56;" f @@ -5420,7 +5421,7 @@ flameWall src/Dodge/Item/Weapon/SprayGuns.hs 54;" f flamerPic src/Dodge/Item/Draw/SPic.hs 331;" f flareCircleAt src/Dodge/WorldEvent/Flash.hs 46;" f flatItemCombinations src/Dodge/Combine/Combinations.hs 49;" f -flatLookupItems src/Dodge/Combine.hs 29;" f +flatLookupItems src/Dodge/Combine.hs 30;" f flatShield src/Dodge/Item/Held/Utility.hs 9;" f flatShieldEquipSPic src/Dodge/Item/Draw/SPic.hs 392;" f flattenIMIMIM src/Dodge/Base/Zone.hs 246;" f @@ -5577,7 +5578,7 @@ gridPoints src/Grid.hs 67;" f gridPoints' src/Grid.hs 79;" f gridPoints'' src/Grid.hs 74;" f gridPointsOff src/Grid.hs 62;" f -groupSplitItemAmounts src/Dodge/Combine.hs 24;" f +groupSplitItemAmounts src/Dodge/Combine.hs 25;" f gruntS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 484;" f guardDisconnectedID src/Dodge/Update/Scroll.hs 71;" f gut1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 516;" f @@ -5706,14 +5707,14 @@ insertAt src/Padding.hs 60;" f insertIMInZone src/Dodge/Base.hs 59;" f insertInTrie src/SimpleTrie.hs 18;" f insertInZoneWith src/Dodge/Zone/Update.hs 17;" f -insertNewKey src/IntMapHelp.hs 63;" f +insertNewKey src/IntMapHelp.hs 66;" f insertOneS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 368;" f insertOver src/ListHelp.hs 47;" f insertS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 318;" f insertWall src/Dodge/Placement/PlaceSpot/Block.hs 122;" f insertWallInZones src/Dodge/Wall/Zone.hs 20;" f insertWalls src/Dodge/Placement/PlaceSpot/Block.hs 117;" f -insertWithNewKeys src/IntMapHelp.hs 69;" f +insertWithNewKeys src/IntMapHelp.hs 72;" f intToBulAmmo src/Dodge/TweakBullet.hs 23;" f internalHammerUpdate src/Dodge/Creature/State.hs 147;" f interpWith src/Dodge/Creature/Boid.hs 10;" f @@ -5755,8 +5756,9 @@ inventoryExtraH src/Dodge/Render/HUD.hs 195;" f inventoryX src/Dodge/Creature.hs 115;" f inverseShockwaveAt src/Dodge/WorldEvent/Shockwave.hs 43;" f invertEncircleDistP src/Dodge/Creature/Boid.hs 13;" f +invertIntMap src/IntMapHelp.hs 101;" f invertIntMap src/Multiset.hs 61;" f -invertInventoryToMap src/Dodge/Combine.hs 18;" f +invertInventoryToMap src/Dodge/Combine.hs 19;" f invisibleChaseCrit src/Dodge/Creature/ChaseCrit.hs 25;" f invisibleWall src/Dodge/Placement/Instance/Wall.hs 16;" f isAmmoIntLink src/Dodge/HeldUse.hs 188;" f @@ -6265,7 +6267,7 @@ nearSeg src/Dodge/Zone.hs 89;" f nearSeg src/Dodge/Zoning/Common.hs 12;" f newExtraAwareness src/Dodge/Creature/Perception.hs 137;" f newHotkey src/Dodge/Hotkey.hs 18;" f -newKey src/IntMapHelp.hs 59;" f +newKey src/IntMapHelp.hs 62;" f newMapKey src/Dodge/Config/KeyConfig.hs 33;" f newSounds src/Dodge/Creature/Perception.hs 170;" f newTextureFramebuffer src/Framebuffer/Setup.hs 16;" f @@ -6868,7 +6870,7 @@ safeMinimumOnMaybe src/FoldableHelp.hs 67;" f safeMinimumOnMaybeF src/FoldableHelp.hs 39;" f safeMinimumOnMaybeL src/FoldableHelp.hs 57;" f safeNormalizeV src/Geometry/Vector.hs 153;" f -safeSwapKeys src/IntMapHelp.hs 76;" f +safeSwapKeys src/IntMapHelp.hs 79;" f safeUncons src/ListHelp.hs 72;" f safeUpdateSingleNode src/Dodge/Tree/Polymorphic.hs 92;" f safeUpdateSingleNode src/TreeHelp.hs 115;" f @@ -7516,7 +7518,7 @@ unlockInv src/Dodge/Inventory/Lock.hs 9;" f unpause src/Dodge/Menu.hs 192;" f unsafeBlinkAction src/Dodge/Creature/Action/Blink.hs 52;" f unsafeBlinkGun src/Dodge/Item/Weapon/Utility.hs 62;" f -unsafeSwapKeys src/IntMapHelp.hs 73;" f +unsafeSwapKeys src/IntMapHelp.hs 76;" f unshadowBlock src/Dodge/Block.hs 38;" f untilJust src/MonadHelp.hs 7;" f untilJustCount src/MonadHelp.hs 14;" f