module Data.Connection.Optic.Float (
    f32u32
  , u32f32
  , u32w64
  , f32i64
  , i64f32
) where

import Data.Connection.Float (Ulp32)
import Data.Int
import Data.Prd.Nan (Nan)
import Data.Profunctor.Optic.Grate
import Data.Profunctor.Optic.Import
import Data.Word
import qualified Data.Connection.Float as F

-- >>> constOf f32u32 (Ulp32 0)
-- 0.0
-- >>> constOf f32u32 (Ulp32 1)
-- 1.0e-45
f32u32 :: Grate' Float Ulp32
f32u32 = connected F.f32u32

u32f32 :: Grate' Ulp32 Float
u32f32 = connected F.u32f32

u32w64 :: Grate' Ulp32 (Nan Word64)
u32w64 = connected F.u32w64

-- >>> constOf f32i64 Nan
-- NaN
-- >>> zipWithOf i64f32 (/) (Def 0) (Def 0)
-- Nan
f32i64 :: Grate' Float (Nan Int64)
f32i64 = connected F.f32i64

i64f32 :: Grate' (Nan Int64) Float
i64f32 = connected F.i64f32