module Composite.Opaleye.Util where

import Data.Profunctor (dimap)
import Opaleye (Field, ToFields, unsafeCoerceColumn)

-- |Coerce one type of 'Column' 'ToFields' profunctor to another using by just asserting the changed type on the column side and using the given function
-- on the Haskell side. Useful when the PG value representation is the same but the Haskell type changes, e.g. for enums.
constantColumnUsing :: ToFields haskell (Field sqlType)
                    -> (haskell' -> haskell)
                    -> ToFields haskell' (Field sqlType')
constantColumnUsing :: ToFields haskell (Field sqlType)
-> (haskell' -> haskell) -> ToFields haskell' (Field sqlType')
constantColumnUsing ToFields haskell (Field sqlType)
oldToFields haskell' -> haskell
f = (haskell' -> haskell)
-> (Field sqlType -> Field sqlType')
-> ToFields haskell (Field sqlType)
-> ToFields haskell' (Field sqlType')
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap haskell' -> haskell
f Field sqlType -> Field sqlType'
forall (n :: Nullability) a (n' :: Nullability) b.
Field_ n a -> Field_ n' b
unsafeCoerceColumn ToFields haskell (Field sqlType)
oldToFields