packages feed

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

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module PureBorrow.Inspection.QSort (
  tests,
  unboxedQsort,
) where

import Control.Concurrent.DivideConquer.Linear (qsort)
import Control.Monad.Borrow.Pure.BO (BO, Mut)
import Data.Vector.Generic qualified as GenericVector
import Data.Vector.Generic.Mutable qualified as Generic
import Data.Vector.Generic.Mutable.Linear.Borrow.Unrestricted qualified as Vector
import Data.Vector.Mutable qualified as Boxed
import Data.Vector.Unboxed qualified as Unboxed
import Prelude.Linear
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.Inspection

{-# SPECIALIZE qsort ::
  Word ->
  Mut α (Vector.Vector Unboxed.Vector Int) %1 ->
  BO α ()
  #-}

unboxedQsort ::
  Word ->
  Mut α (Vector.Vector Unboxed.Vector Int) %1 ->
  BO α ()
{-# NOINLINE unboxedQsort #-}
unboxedQsort = qsort

tests :: TestTree
tests =
  testGroup
    "qsort"
    [ $( inspectTest
           ( ( hasNoTypeClassesExcept
                 'unboxedQsort
                 [''GenericVector.Vector, ''Ord]
             )
               { testName =
                   Just
                     "specialization retains only Vector and Ord dictionaries"
               }
           )
       )
    , $( inspectTest
           ( (hasNoType 'unboxedQsort ''Boxed.MVector)
               { testName =
                   Just "root has no boxed-vector backing"
               }
           )
       )
    , $( inspectTest
           ( ( doesNotUseAnyOf
                 'unboxedQsort
                 [ 'qsort
                 , 'Vector.unsafeGet
                 , 'Vector.unsafeSwap
                 , 'Generic.unsafeRead
                 , 'Generic.unsafeSwap
                 , 'Generic.unsafeWrite
                 , 'Generic.basicUnsafeRead
                 , 'Generic.basicUnsafeWrite
                 ]
             )
               { testName =
                   Just "root contains no listed generic-vector operations"
               }
           )
       )
    ]