{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}

module Octane.Type.Float32
  ( Float32(..)
  ) where

import Data.Function ((&))

import qualified Data.Aeson as Aeson
import qualified Data.Default.Class as Default
import qualified Data.OverloadedRecords.TH as OverloadedRecords

-- | A 32-bit float.
newtype Float32 = Float32
  { float32Unpack :: Float
  } deriving (Eq, Fractional, Num, Ord)

$(OverloadedRecords.overloadedRecord Default.def ''Float32)

-- | Shown as @12.34@.
instance Show Float32 where
  show float32 = show (#unpack float32)

-- | Encoded directly as a JSON number.
instance Aeson.ToJSON Float32 where
  toJSON float32 = float32 & #unpack & Aeson.toJSON