packages feed

pure-borrow-0.1.0.0: test-inspection/PureBorrow/Inspection/Worklist/Resume.hs

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE NoImplicitPrelude #-}

module PureBorrow.Inspection.Worklist.Resume (
  tests,
  resumeEdgeWorker,
  openOnceEdgeWorker,
) where

import Control.Monad.Borrow.Pure.BO (BO, Borrow, Mut)
import Control.Monad.Borrow.Pure.Experimental.Borrows (Aliases, reborrowings)
import Control.Monad.Borrow.Pure.Lifetime (type (>=))
import Data.Int (Int64)
import Data.Vector qualified as V
import Data.Vector.Generic.Mutable.Growable.Linear.Borrow.Unrestricted qualified as Growable
import Data.Vector.Generic.Mutable.Linear.Borrow.Unrestricted qualified as Fixed
import Data.Vector.Unboxed qualified as U
import Prelude.Linear
import PureBorrow.Internal.Bench.Worklist.Resume
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.Inspection

resumeEdgeWorker ::
  (α >= δ, β >= δ, γ >= δ) =>
  Int ->
  Int ->
  Int ->
  Int ->
  [Int] ->
  Int64 ->
  Borrow bk1 α (Fixed.Vector U.Vector Int) %1 ->
  Borrow bk2 β (Fixed.Vector V.Vector (Int, Int)) %1 ->
  Mut γ (Fixed.Vector U.Vector Int) %1 ->
  BO
    δ
    ( Ur (Int, Int, [Int], Int64)
    , Borrow bk1 α (Fixed.Vector U.Vector Int)
    , Borrow bk2 β (Fixed.Vector V.Vector (Int, Int))
    , Mut γ (Fixed.Vector U.Vector Int)
    )
{-# NOINLINE resumeEdgeWorker #-}
resumeEdgeWorker = worklistPureBorrowResumeEdgeWorker

openOnceEdgeWorker ::
  Int ->
  Int ->
  Int ->
  Int ->
  Int64 ->
  Mut α (Fixed.Vector U.Vector Int) %1 ->
  Mut α (Fixed.Vector V.Vector (Int, Int)) %1 ->
  Mut α (Fixed.Vector U.Vector Int) %1 ->
  Mut α (Fixed.Vector U.Vector Int) %1 ->
  BO
    α
    ( Ur (Int, Int, Int64)
    , Mut α (Fixed.Vector U.Vector Int)
    , Mut α (Fixed.Vector V.Vector (Int, Int))
    , Mut α (Fixed.Vector U.Vector Int)
    , Mut α (Fixed.Vector U.Vector Int)
    )
{-# NOINLINE openOnceEdgeWorker #-}
openOnceEdgeWorker = worklistPureBorrowOpenOnceEdgeWorker

tests :: TestTree
tests =
  testGroup
    "worklist resume"
    [ $( inspectTest
           ( (hasNoTypeClasses 'resumeEdgeWorker)
               { testName =
                   Just "resume edge worker has no type-class dictionaries"
               }
           )
       )
    , $( inspectTest
           ( (hasNoTypeClasses 'openOnceEdgeWorker)
               { testName =
                   Just "open-once edge worker has no type-class dictionaries"
               }
           )
       )
    , $( inspectTest
           ( (hasNoType 'resumeEdgeWorker ''Growable.GrowableVector)
               { testName =
                   Just "resume edge worker has no growable header"
               }
           )
       )
    , $( inspectTest
           ( (hasNoType 'resumeEdgeWorker ''Aliases)
               { testName =
                   Just "resume edge worker has no plural-borrow bundle"
               }
           )
       )
    , $( inspectTest
           ( ( doesNotUseAnyOf
                 'resumeEdgeWorker
                 [ 'worklistPureBorrowResumeEdgeWorker
                 , 'Fixed.unsafeGet
                 , 'Fixed.unsafeWrite
                 , 'Growable.getContents
                 , 'Growable.extend
                 , 'reborrowings
                 ]
             )
               { testName =
                   Just "resume edge worker contains only specialized backing access"
               }
           )
       )
    , $( inspectTest
           ( ( doesNotUseAnyOf
                 'openOnceEdgeWorker
                 [ 'worklistPureBorrowOpenOnceEdgeWorker
                 , 'Fixed.unsafeGet
                 , 'Fixed.unsafeWrite
                 , 'Growable.getContents
                 , 'Growable.extend
                 , 'reborrowings
                 ]
             )
               { testName =
                   Just "open-once edge worker contains only specialized backing access"
               }
           )
       )
    ]