passman-core-0.1.0.0: internal/Passman/Core/Internal/Util.hs
-- Copyright (C) 2017 Matthew Harm Bekkema
--
-- This file is part of passman-core
--
-- passman-core is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- passman-core is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see <https://www.gnu.org/licenses/>.
-----------------------------------------------------------------------------
-- |
-- Module : Passman.Core.Internal.Util
-- Copyright : Matthew Harm Bekkema 2017
-- License : GPL-3
-- Maintainer : mbekkema97@gmail.com
-----------------------------------------------------------------------------
module Passman.Core.Internal.Util
( bytesToInt
, fromBase
, toBase
) where
import Numeric.Natural (Natural)
import Data.ByteString (ByteString, unpack)
import Data.List (foldl', unfoldr)
import Data.Tuple (swap)
import Data.IntCast (intCast)
bytesToInt :: ByteString -> Natural
bytesToInt = fromBase 256 . map intCast . unpack
fromBase :: Natural -> [Natural] -> Natural
fromBase 0 = error "Base 0"
fromBase 1 = error "Base 1"
fromBase base = foldl' (\acc x -> acc * base + x) 0
toBase :: Natural -> Natural -> [Natural]
toBase base = reverse . toBaseRev base
toBaseRev :: Natural -> Natural -> [Natural]
toBaseRev 0 = error "Base 0"
toBaseRev 1 = error "Base 1"
toBaseRev base = unfoldr helper
where
helper :: Natural -> Maybe (Natural, Natural)
helper 0 = Nothing
helper i = Just $ swap $ quotRem i base