module Synthesizer.LLVM.Private where

import qualified LLVM.Extra.MaybeContinuation as MaybeCont
import qualified LLVM.Extra.Multi.Value as MultiValue

import qualified LLVM.Core as LLVM

import qualified Type.Data.Num.Decimal as TypeNum

import Control.Applicative (liftA2)


unbool :: MultiValue.T Bool -> LLVM.Value Bool
unbool :: T Bool -> Value Bool
unbool (MultiValue.Cons Repr Bool
b) = Repr Bool
Value Bool
b

noLocalPtr :: f -> (LLVM.Value (LLVM.Ptr (LLVM.Struct ())) -> f)
noLocalPtr :: forall f. f -> Value (Ptr (Struct ())) -> f
noLocalPtr = f -> Value (Ptr (Struct ())) -> f
forall a b. a -> b -> a
const

getPairPtrs ::
   LLVM.Value (LLVM.Ptr (LLVM.Struct (a, (b, ())))) ->
   MaybeCont.T r c (LLVM.Value (LLVM.Ptr a), LLVM.Value (LLVM.Ptr b))
getPairPtrs :: forall a b r c.
Value (Ptr (Struct (a, (b, ()))))
-> T r c (Value (Ptr a), Value (Ptr b))
getPairPtrs Value (Ptr (Struct (a, (b, ()))))
ptr =
   CodeGenFunction r (Value (Ptr a), Value (Ptr b))
-> T r c (Value (Ptr a), Value (Ptr b))
forall r a z. CodeGenFunction r a -> T r z a
MaybeCont.lift (CodeGenFunction r (Value (Ptr a), Value (Ptr b))
 -> T r c (Value (Ptr a), Value (Ptr b)))
-> CodeGenFunction r (Value (Ptr a), Value (Ptr b))
-> T r c (Value (Ptr a), Value (Ptr b))
forall a b. (a -> b) -> a -> b
$
   (Value (Ptr a) -> Value (Ptr b) -> (Value (Ptr a), Value (Ptr b)))
-> CodeGenFunction r (Value (Ptr a))
-> CodeGenFunction r (Value (Ptr b))
-> CodeGenFunction r (Value (Ptr a), Value (Ptr b))
forall a b c.
(a -> b -> c)
-> CodeGenFunction r a
-> CodeGenFunction r b
-> CodeGenFunction r c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (,)
      (Value (Ptr (Struct (a, (b, ()))))
-> (Proxy D0, ())
-> CodeGenFunction
     r
     (Value (Ptr (ElementPtrType (Struct (a, (b, ()))) (Proxy D0, ()))))
forall o i r.
GetElementPtr o i =>
Value (Ptr o)
-> i -> CodeGenFunction r (Value (Ptr (ElementPtrType o i)))
LLVM.getElementPtr0 Value (Ptr (Struct (a, (b, ()))))
ptr (Proxy D0
TypeNum.d0, ()))
      (Value (Ptr (Struct (a, (b, ()))))
-> (Proxy D1, ())
-> CodeGenFunction
     r
     (Value (Ptr (ElementPtrType (Struct (a, (b, ()))) (Proxy D1, ()))))
forall o i r.
GetElementPtr o i =>
Value (Ptr o)
-> i -> CodeGenFunction r (Value (Ptr (ElementPtrType o i)))
LLVM.getElementPtr0 Value (Ptr (Struct (a, (b, ()))))
ptr (Proxy D1
TypeNum.d1, ()))