{- |
Description: List of prime factors and their multiplicities
Copyright: Copyright (C) 2021 Yoo Chung
License: GPL-3.0-or-later
Maintainer: dev@chungyc.org

Some solutions to "Problems.P36" of Ninety-Nine Haskell "Problems".
-}
module Solutions.P36 (primeFactorsMultiplicity) where

import           Data.List    (genericLength, group)
import           Problems.P35

-- | Determine the prime factors of a given positive integer.
-- Construct a list containing the prime factors and their multiplicity.
primeFactorsMultiplicity :: Integral a => a -> [(a, a)]
primeFactorsMultiplicity :: forall a. Integral a => a -> [(a, a)]
primeFactorsMultiplicity = ([a] -> (a, a)) -> [[a]] -> [(a, a)]
forall a b. (a -> b) -> [a] -> [b]
map (\[a]
xs -> ([a] -> a
forall {a}. Num a => [a] -> a
factor [a]
xs, [a] -> a
forall i a. Num i => [a] -> i
genericLength [a]
xs)) ([[a]] -> [(a, a)]) -> (a -> [[a]]) -> a -> [(a, a)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [[a]]
forall a. Eq a => [a] -> [[a]]
group ([a] -> [[a]]) -> (a -> [a]) -> a -> [[a]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> [a]
forall a. Integral a => a -> [a]
primeFactors
  where factor :: [a] -> a
factor [] = a
1
        factor (a
x:[a]
_) = a
x