{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
module Serokell.Data.Variant.Variant
( Variant (..)
, VarList
, VarMap
) where
import Universum
import qualified Formatting.Buildable as B
import GHC.Exts (IsList (..))
import Serokell.Util.Text (listBuilderJSONIndent, mapBuilder)
import qualified Data.Vector as V
import qualified Serokell.Util.Base16 as B16
type VarList = Vector Variant
type VarMap = HashMap Variant Variant
data Variant
= VarNone
| VarBool !Bool
| VarInt !Int64
| VarUInt !Word64
| VarFloat !Double
| VarBytes !ByteString
| VarString !Text
| VarList !VarList
| VarMap !VarMap
deriving (Show,Eq,Generic)
instance B.Buildable Variant where
build VarNone = "None"
build (VarBool v) = B.build v
build (VarInt v) = B.build v
build (VarUInt v) = B.build v
build (VarFloat v) = B.build v
build (VarBytes v) = B.build . B16.encode $ v
build (VarString v) = B.build v
build (VarList v) = listBuilderJSONIndent 2 v
build (VarMap v) = mapBuilder . toPairs $ v
instance Hashable (Vector Variant) where
hashWithSalt salt = V.foldr' (flip hashWithSalt) (hashWithSalt salt ())
instance Hashable Variant
instance IsString Variant where
fromString = VarString . fromString
instance IsList Variant where
type Item Variant = Variant
toList (VarList v) = Universum.toList v
toList _ = error "toList: not a list"
fromList = VarList . fromList
instance NFData Variant