module Part2 where import Commons applyConversionMap :: ConversionMap -> Int -> Int -> [Int] applyConversionMap [] v vs = [v, vs] applyConversionMap _ _ 0 = [] applyConversionMap (e: t) v vs | v >= sourceStart e && v <= sourceStart e + size e = let newVs = min (sourceStart e + size e) (v + vs) - v in (destinationStart e - sourceStart e + v): newVs: applyConversionMap t (v + newVs) (vs - newVs) | v < sourceStart e && v + vs >= sourceStart e = let newVs = v + vs - sourceStart e in applyConversionMap (e: t) (sourceStart e) newVs ++ applyConversionMap t v (vs - newVs) | otherwise = applyConversionMap t v vs applyConversionMapToList :: ConversionMap -> [Int] -> [Int] applyConversionMapToList cm [] = [] applyConversionMapToList cm (v: vs: t) = applyConversionMap cm v vs ++ applyConversionMapToList cm t getLocations :: Almanac -> [Int] getLocations a = applyConversionMapToList (toLocation a) . applyConversionMapToList (toHumidity a) . applyConversionMapToList (toTemperature a) . applyConversionMapToList (toLight a) . applyConversionMapToList (toWater a) . applyConversionMapToList (toFertilizer a) . applyConversionMapToList (toSoil a) $ seeds a dropLocationsSizes :: [Int] -> [Int] dropLocationsSizes [] = [] dropLocationsSizes (start: size: t) = start: dropLocationsSizes t getLocationsStarts :: Almanac -> [Int] getLocationsStarts = dropLocationsSizes . getLocations