module Poseidon.PoseidonVersion (
    validPoseidonVersions,
    showPoseidonVersion,
    latestPoseidonVersion,
    asVersion,
    minimalRequiredClientVersion
) where

import           Data.Version (Version (..), makeVersion, showVersion)

newtype PoseidonVersion = PoseidonVersion Version
    deriving (Int -> PoseidonVersion -> ShowS
[PoseidonVersion] -> ShowS
PoseidonVersion -> String
(Int -> PoseidonVersion -> ShowS)
-> (PoseidonVersion -> String)
-> ([PoseidonVersion] -> ShowS)
-> Show PoseidonVersion
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> PoseidonVersion -> ShowS
showsPrec :: Int -> PoseidonVersion -> ShowS
$cshow :: PoseidonVersion -> String
show :: PoseidonVersion -> String
$cshowList :: [PoseidonVersion] -> ShowS
showList :: [PoseidonVersion] -> ShowS
Show, PoseidonVersion -> PoseidonVersion -> Bool
(PoseidonVersion -> PoseidonVersion -> Bool)
-> (PoseidonVersion -> PoseidonVersion -> Bool)
-> Eq PoseidonVersion
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PoseidonVersion -> PoseidonVersion -> Bool
== :: PoseidonVersion -> PoseidonVersion -> Bool
$c/= :: PoseidonVersion -> PoseidonVersion -> Bool
/= :: PoseidonVersion -> PoseidonVersion -> Bool
Eq, Eq PoseidonVersion
Eq PoseidonVersion
-> (PoseidonVersion -> PoseidonVersion -> Ordering)
-> (PoseidonVersion -> PoseidonVersion -> Bool)
-> (PoseidonVersion -> PoseidonVersion -> Bool)
-> (PoseidonVersion -> PoseidonVersion -> Bool)
-> (PoseidonVersion -> PoseidonVersion -> Bool)
-> (PoseidonVersion -> PoseidonVersion -> PoseidonVersion)
-> (PoseidonVersion -> PoseidonVersion -> PoseidonVersion)
-> Ord PoseidonVersion
PoseidonVersion -> PoseidonVersion -> Bool
PoseidonVersion -> PoseidonVersion -> Ordering
PoseidonVersion -> PoseidonVersion -> PoseidonVersion
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: PoseidonVersion -> PoseidonVersion -> Ordering
compare :: PoseidonVersion -> PoseidonVersion -> Ordering
$c< :: PoseidonVersion -> PoseidonVersion -> Bool
< :: PoseidonVersion -> PoseidonVersion -> Bool
$c<= :: PoseidonVersion -> PoseidonVersion -> Bool
<= :: PoseidonVersion -> PoseidonVersion -> Bool
$c> :: PoseidonVersion -> PoseidonVersion -> Bool
> :: PoseidonVersion -> PoseidonVersion -> Bool
$c>= :: PoseidonVersion -> PoseidonVersion -> Bool
>= :: PoseidonVersion -> PoseidonVersion -> Bool
$cmax :: PoseidonVersion -> PoseidonVersion -> PoseidonVersion
max :: PoseidonVersion -> PoseidonVersion -> PoseidonVersion
$cmin :: PoseidonVersion -> PoseidonVersion -> PoseidonVersion
min :: PoseidonVersion -> PoseidonVersion -> PoseidonVersion
Ord)

validPoseidonVersions :: [PoseidonVersion]
validPoseidonVersions :: [PoseidonVersion]
validPoseidonVersions = ([Int] -> PoseidonVersion) -> [[Int]] -> [PoseidonVersion]
forall a b. (a -> b) -> [a] -> [b]
map (Version -> PoseidonVersion
PoseidonVersion (Version -> PoseidonVersion)
-> ([Int] -> Version) -> [Int] -> PoseidonVersion
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> Version
makeVersion) [[Int
2,Int
5,Int
0], [Int
2,Int
6,Int
0], [Int
2,Int
7,Int
0], [Int
2,Int
7,Int
1]]

latestPoseidonVersion :: PoseidonVersion
latestPoseidonVersion :: PoseidonVersion
latestPoseidonVersion = [PoseidonVersion] -> PoseidonVersion
forall a. HasCallStack => [a] -> a
last [PoseidonVersion]
validPoseidonVersions

asVersion :: PoseidonVersion -> Version
asVersion :: PoseidonVersion -> Version
asVersion (PoseidonVersion Version
x) = Version
x

showPoseidonVersion :: PoseidonVersion -> String
showPoseidonVersion :: PoseidonVersion -> String
showPoseidonVersion (PoseidonVersion Version
x) = Version -> String
showVersion Version
x

-- this is for the server
minimalRequiredClientVersion :: Version
minimalRequiredClientVersion :: Version
minimalRequiredClientVersion = [Int] -> Version
makeVersion [Int
1, Int
1, Int
8, Int
5]