summaryrefslogtreecommitdiff
path: root/Coolbal/DataVersionTag.hs
blob: a994e909a9eb43aff91ac6f7dc2e208d2aa861a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module Coolbal.DataVersionTag where

import Data.Binary
import GHC.TypeNats


data DataVersionTag (n :: Nat) = DataVersionTag
  deriving (Show, Eq, Ord)

instance (KnownNat n, n <= 255) => Binary (DataVersionTag n) where
    put v = putWord8 (fromIntegral (natVal v))
    get = do
        b <- getWord8
        let result = DataVersionTag :: DataVersionTag n
        if b == fromIntegral (natVal result)
            then return result
            else fail ("DataVersionTag: read version " ++ show b ++ ", application expects version " ++ show (natVal result))