summaryrefslogtreecommitdiff
path: root/testsuite/tests/deriving/should_compile/T8138.hs
blob: e6d9781a7aaa4c7627620296fc53c145a9bafb88 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
{-# LANGUAGE ScopedTypeVariables #-}

module Main where

import Control.Monad.ST
import Data.Primitive

main :: IO ()
main = do
    let xs :: [Float] = runST $ do
        barr <- mutableByteArrayFromList [1..fromIntegral n::Float]
        peekByteArray n barr
    print xs
  where
    n = 13

mutableByteArrayFromList :: forall s a . (Prim a)
                         => [a]
                         -> ST s (MutableByteArray s)
mutableByteArrayFromList xs = do
    arr <- newByteArray (length xs*sizeOf (undefined :: a))
    loop arr 0 xs
    return arr
  where
    loop :: MutableByteArray s -> Int -> [a] -> ST s ()
    loop _ _ [] = return ()

    loop arr i (x : xs) = do
        writeByteArray arr i x
        loop arr (i+1) xs

peekByteArray :: (Prim a)
              => Int
              -> MutableByteArray s
              -> ST s [a]
peekByteArray n arr =
    loop 0 arr
  where
    loop :: (Prim a)
         => Int
         -> MutableByteArray s
         -> ST s [a]
    loop i _ | i >= n = return []

    loop i arr = do
        x  <- readByteArray arr i
        xs <- loop (i+1) arr
        return (x : xs)