module Changelogged.Pure where
import Prelude hiding (FilePath)
import qualified Data.HashMap.Strict as HM
import Data.Maybe (fromMaybe)
import Data.Text (Text)
import qualified Data.Text as Text
import Filesystem.Path.CurrentOS (encodeString, FilePath)
import Changelogged.Types
maxByLen :: [Text] -> Maybe Text
maxByLen [] = Nothing
maxByLen hs = Just $ foldl1 (\left right -> if Text.length left > Text.length right then left else right) hs
defaultedEmpty :: Maybe (HM.HashMap k v) -> HM.HashMap k v
defaultedEmpty = fromMaybe HM.empty
fromJustCustom :: String -> Maybe a -> a
fromJustCustom msg Nothing = error msg
fromJustCustom _ (Just a) = a
tuplify :: [Int] -> (Int, Int, Int, Int, Int)
tuplify [] = (0,0,0,0,0)
tuplify [a1] = (a1,0,0,0,0)
tuplify [a1,a2] = (a1,a2,0,0,0)
tuplify [a1,a2,a3] = (a1,a2,a3,0,0)
tuplify [a1,a2,a3,a4] = (a1,a2,a3,a4,0)
tuplify [a1,a2,a3,a4,a5] = (a1,a2,a3,a4,a5)
tuplify (a1:a2:a3:a4:a5:_) = (a1,a2,a3,a4,a5)
delimited :: Text -> (Int, Int, Int, Int, Int)
delimited ver = tuplify $ map (read . Text.unpack) (Text.split (=='.') ver)
bump :: (Int, Int, Int, Int, Int) -> Level -> Text
bump (app, major, minor, fix, doc) lev = Text.intercalate "." $ map showText $ case lev of
App -> [app + 1, 0]
Major -> [app, major + 1, 0]
Minor -> [app, major, minor + 1, 0]
Fix -> [app, major, minor, fix + 1, 0]
Doc -> [app, major, minor, fix, doc + 1]
showPath :: FilePath -> Text
showPath = Text.pack . encodeString
showText :: Show a => a -> Text
showText = Text.pack . show