module Feldspar.Data.Queue
( Queue (..)
, initQueueFromBuffer
, initQueue
, newQueue
, initQueueFromBuffer2
, initQueue2
, newQueue2
) where
import Prelude ()
import Feldspar
import Feldspar.Data.Vector
data Queue a = Queue
{ Queue a -> forall (m :: * -> *). MonadComp m => Data Index -> m a
indexQ :: forall m . MonadComp m => Data Index -> m a
, Queue a -> forall (m :: * -> *). MonadComp m => a -> m ()
putQ :: forall m . MonadComp m => a -> m ()
, Queue a
-> forall (m :: * -> *) b.
(Syntax b, MonadComp m) =>
(Pull a -> m b) -> m b
withQ :: forall m b . (Syntax b, MonadComp m) => (Pull a -> m b) -> m b
}
initQueueFromBuffer :: forall m a . (Syntax a, MonadComp m) =>
Arr a -> m (Queue a)
initQueueFromBuffer :: Arr a -> m (Queue a)
initQueueFromBuffer Arr a
buf = do
Ref (Data Index)
ir <- Data Index -> m (Ref (Data Index))
forall a (m :: * -> *). (Syntax a, MonadComp m) => a -> m (Ref a)
initRef Data Index
0
let indexQ :: forall m2 . MonadComp m2 => Data Index -> m2 a
indexQ :: Data Index -> m2 a
indexQ Data Index
j = do
Data Index
i <- Ref (Data Index) -> m2 (Data Index)
forall a (m :: * -> *). (Syntax a, MonadComp m) => Ref a -> m a
unsafeFreezeRef Ref (Data Index)
ir
Arr a -> Data Index -> m2 a
forall a (m :: * -> *).
(Syntax a, MonadComp m) =>
Arr a -> Data Index -> m a
getArr Arr a
buf (Data Index -> m2 a) -> Data Index -> m2 a
forall a b. (a -> b) -> a -> b
$ Data Index -> Data Index -> Data Index
calcIndex Data Index
i Data Index
j
putQ :: forall m2 . MonadComp m2 => a -> m2 ()
putQ :: a -> m2 ()
putQ a
a = do
Data Index
i <- Ref (Data Index) -> m2 (Data Index)
forall a (m :: * -> *). (Syntax a, MonadComp m) => Ref a -> m a
unsafeFreezeRef Ref (Data Index)
ir
Arr a -> Data Index -> a -> m2 ()
forall (m :: * -> *) a.
(Syntax a, MonadComp m) =>
Arr a -> Data Index -> a -> m ()
setArr Arr a
buf Data Index
i a
a
Ref (Data Index) -> Data Index -> m2 ()
forall a (m :: * -> *).
(Syntax a, MonadComp m) =>
Ref a -> a -> m ()
setRef Ref (Data Index)
ir ((Data Index
iData Index -> Data Index -> Data Index
forall a. Num a => a -> a -> a
+Data Index
1) Data Index -> Data Index -> Data Index
forall a. (Integral a, PrimType a) => Data a -> Data a -> Data a
`mod` Data Index
len)
withQ :: forall m2 b . (Syntax b, MonadComp m2) => (Pull a -> m2 b) -> m2 b
withQ :: (Pull a -> m2 b) -> m2 b
withQ Pull a -> m2 b
f = do
Data Index
i <- Ref (Data Index) -> m2 (Data Index)
forall a (m :: * -> *). (Syntax a, MonadComp m) => Ref a -> m a
unsafeFreezeRef Ref (Data Index)
ir
IArr a
vec <- Arr a -> m2 (IArr a)
forall (m :: * -> *) a. MonadComp m => Arr a -> m (IArr a)
unsafeFreezeArr Arr a
buf
Pull a -> m2 b
f (Pull a -> m2 b) -> Pull a -> m2 b
forall a b. (a -> b) -> a -> b
$ (Data Index -> Data Index -> Data Index) -> IArr a -> Pull a
forall vec a.
Pully vec a =>
(Data Index -> Data Index -> Data Index) -> vec -> Pull a
backPermute (\Data Index
_ -> Data Index -> Data Index -> Data Index
calcIndex Data Index
i) IArr a
vec
Queue a -> m (Queue a)
forall (m :: * -> *) a. Monad m => a -> m a
return Queue :: forall a.
(forall (m :: * -> *). MonadComp m => Data Index -> m a)
-> (forall (m :: * -> *). MonadComp m => a -> m ())
-> (forall (m :: * -> *) b.
(Syntax b, MonadComp m) =>
(Pull a -> m b) -> m b)
-> Queue a
Queue {forall (m2 :: * -> *). MonadComp m2 => a -> m2 ()
forall (m2 :: * -> *). MonadComp m2 => Data Index -> m2 a
forall (m2 :: * -> *) b.
(Syntax b, MonadComp m2) =>
(Pull a -> m2 b) -> m2 b
withQ :: forall (m2 :: * -> *) b.
(Syntax b, MonadComp m2) =>
(Pull a -> m2 b) -> m2 b
putQ :: forall (m2 :: * -> *). MonadComp m2 => a -> m2 ()
indexQ :: forall (m2 :: * -> *). MonadComp m2 => Data Index -> m2 a
withQ :: forall (m2 :: * -> *) b.
(Syntax b, MonadComp m2) =>
(Pull a -> m2 b) -> m2 b
putQ :: forall (m2 :: * -> *). MonadComp m2 => a -> m2 ()
indexQ :: forall (m2 :: * -> *). MonadComp m2 => Data Index -> m2 a
..}
where
len :: Data Index
len = Arr a -> Data Index
forall a. Finite a => a -> Data Index
length Arr a
buf
calcIndex :: Data Index -> Data Index -> Data Index
calcIndex Data Index
i Data Index
j = (Data Index
lenData Index -> Data Index -> Data Index
forall a. Num a => a -> a -> a
+Data Index
iData Index -> Data Index -> Data Index
forall a. Num a => a -> a -> a
-Data Index
jData Index -> Data Index -> Data Index
forall a. Num a => a -> a -> a
-Data Index
1) Data Index -> Data Index -> Data Index
forall a. (Integral a, PrimType a) => Data a -> Data a -> Data a
`mod` Data Index
len
initQueue :: (Manifestable m vec a, Finite vec, Syntax a, MonadComp m)
=> vec
-> m (Queue a)
initQueue :: vec -> m (Queue a)
initQueue vec
init = do
Arr a
buf <- Data Index -> m (Arr a)
forall a (m :: * -> *).
(Type (Internal a), MonadComp m) =>
Data Index -> m (Arr a)
newArr (Data Index -> m (Arr a)) -> Data Index -> m (Arr a)
forall a b. (a -> b) -> a -> b
$ vec -> Data Index
forall a. Finite a => a -> Data Index
length vec
init
Arr a -> vec -> m ()
forall (m :: * -> *) vec a.
(Manifestable m vec a, Syntax a) =>
Arr a -> vec -> m ()
manifestStore Arr a
buf vec
init
Arr a -> m (Queue a)
forall (m :: * -> *) a.
(Syntax a, MonadComp m) =>
Arr a -> m (Queue a)
initQueueFromBuffer Arr a
buf
newQueue :: (Syntax a, MonadComp m) => Data Length -> m (Queue a)
newQueue :: Data Index -> m (Queue a)
newQueue Data Index
l = Data Index -> m (Arr a)
forall a (m :: * -> *).
(Type (Internal a), MonadComp m) =>
Data Index -> m (Arr a)
newArr Data Index
l m (Arr a) -> (Arr a -> m (Queue a)) -> m (Queue a)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Arr a -> m (Queue a)
forall (m :: * -> *) a.
(Syntax a, MonadComp m) =>
Arr a -> m (Queue a)
initQueueFromBuffer
initQueueFromBuffer2 :: forall m a . (Syntax a, MonadComp m)
=> Data Length
-> Arr a
-> m (Queue a)
initQueueFromBuffer2 :: Data Index -> Arr a -> m (Queue a)
initQueueFromBuffer2 Data Index
len Arr a
buf = do
Ref (Data Index)
ir <- Data Index -> m (Ref (Data Index))
forall a (m :: * -> *). (Syntax a, MonadComp m) => a -> m (Ref a)
initRef Data Index
0
let indexQ :: forall m2 . MonadComp m2 => Data Index -> m2 a
indexQ :: Data Index -> m2 a
indexQ Data Index
j = do
Data Index
i <- Ref (Data Index) -> m2 (Data Index)
forall a (m :: * -> *). (Syntax a, MonadComp m) => Ref a -> m a
unsafeFreezeRef Ref (Data Index)
ir
Arr a -> Data Index -> m2 a
forall a (m :: * -> *).
(Syntax a, MonadComp m) =>
Arr a -> Data Index -> m a
getArr Arr a
buf (Data Index
lenData Index -> Data Index -> Data Index
forall a. Num a => a -> a -> a
+Data Index
iData Index -> Data Index -> Data Index
forall a. Num a => a -> a -> a
-Data Index
jData Index -> Data Index -> Data Index
forall a. Num a => a -> a -> a
-Data Index
1)
putQ :: forall m2 . MonadComp m2 => a -> m2 ()
putQ :: a -> m2 ()
putQ a
a = do
Data Index
i <- Ref (Data Index) -> m2 (Data Index)
forall a (m :: * -> *). (Syntax a, MonadComp m) => Ref a -> m a
unsafeFreezeRef Ref (Data Index)
ir
Arr a -> Data Index -> a -> m2 ()
forall (m :: * -> *) a.
(Syntax a, MonadComp m) =>
Arr a -> Data Index -> a -> m ()
setArr Arr a
buf Data Index
i a
a
Arr a -> Data Index -> a -> m2 ()
forall (m :: * -> *) a.
(Syntax a, MonadComp m) =>
Arr a -> Data Index -> a -> m ()
setArr Arr a
buf (Data Index
iData Index -> Data Index -> Data Index
forall a. Num a => a -> a -> a
+Data Index
len) a
a
Ref (Data Index) -> Data Index -> m2 ()
forall a (m :: * -> *).
(Syntax a, MonadComp m) =>
Ref a -> a -> m ()
setRef Ref (Data Index)
ir ((Data Index
iData Index -> Data Index -> Data Index
forall a. Num a => a -> a -> a
+Data Index
1) Data Index -> Data Index -> Data Index
forall a. (Integral a, PrimType a) => Data a -> Data a -> Data a
`mod` Data Index
len)
withQ :: forall m2 b . (Syntax b, MonadComp m2) => (Pull a -> m2 b) -> m2 b
withQ :: (Pull a -> m2 b) -> m2 b
withQ Pull a -> m2 b
f = do
Data Index
i <- Ref (Data Index) -> m2 (Data Index)
forall a (m :: * -> *). (Syntax a, MonadComp m) => Ref a -> m a
unsafeFreezeRef Ref (Data Index)
ir
IArr a
vec <- Arr a -> m2 (IArr a)
forall (m :: * -> *) a. MonadComp m => Arr a -> m (IArr a)
unsafeFreezeArr Arr a
buf
Pull a -> m2 b
f (Pull a -> m2 b) -> Pull a -> m2 b
forall a b. (a -> b) -> a -> b
$ Pull a -> Pull a
forall vec a. Pully vec a => vec -> Pull a
reverse (Pull a -> Pull a) -> Pull a -> Pull a
forall a b. (a -> b) -> a -> b
$ Data Index -> Pull a -> Pull a
forall vec a. Pully vec a => Data Index -> vec -> Pull a
take Data Index
len (Pull a -> Pull a) -> Pull a -> Pull a
forall a b. (a -> b) -> a -> b
$ Data Index -> IArr a -> Pull a
forall vec a. Pully vec a => Data Index -> vec -> Pull a
drop Data Index
i IArr a
vec
Queue a -> m (Queue a)
forall (m :: * -> *) a. Monad m => a -> m a
return Queue :: forall a.
(forall (m :: * -> *). MonadComp m => Data Index -> m a)
-> (forall (m :: * -> *). MonadComp m => a -> m ())
-> (forall (m :: * -> *) b.
(Syntax b, MonadComp m) =>
(Pull a -> m b) -> m b)
-> Queue a
Queue {forall (m2 :: * -> *). MonadComp m2 => a -> m2 ()
forall (m2 :: * -> *). MonadComp m2 => Data Index -> m2 a
forall (m2 :: * -> *) b.
(Syntax b, MonadComp m2) =>
(Pull a -> m2 b) -> m2 b
withQ :: forall (m2 :: * -> *) b.
(Syntax b, MonadComp m2) =>
(Pull a -> m2 b) -> m2 b
putQ :: forall (m2 :: * -> *). MonadComp m2 => a -> m2 ()
indexQ :: forall (m2 :: * -> *). MonadComp m2 => Data Index -> m2 a
withQ :: forall (m2 :: * -> *) b.
(Syntax b, MonadComp m2) =>
(Pull a -> m2 b) -> m2 b
putQ :: forall (m2 :: * -> *). MonadComp m2 => a -> m2 ()
indexQ :: forall (m2 :: * -> *). MonadComp m2 => Data Index -> m2 a
..}
initQueue2 :: (Pushy m vec a, Finite vec, Syntax a, MonadComp m)
=> vec
-> m (Queue a)
initQueue2 :: vec -> m (Queue a)
initQueue2 vec
init = do
Arr a
buf <- Data Index -> m (Arr a)
forall a (m :: * -> *).
(Type (Internal a), MonadComp m) =>
Data Index -> m (Arr a)
newArr (Data Index
2Data Index -> Data Index -> Data Index
forall a. Num a => a -> a -> a
*Data Index
len)
Arr a -> Push m a -> m ()
forall (m :: * -> *) vec a.
(Manifestable m vec a, Syntax a) =>
Arr a -> vec -> m ()
manifestStore Arr a
buf (vec
initvec -> vec -> Push m a
forall (m :: * -> *) vec1 a vec2.
(Pushy m vec1 a, Pushy m vec2 a, Monad m) =>
vec1 -> vec2 -> Push m a
++vec
init)
Data Index -> Arr a -> m (Queue a)
forall (m :: * -> *) a.
(Syntax a, MonadComp m) =>
Data Index -> Arr a -> m (Queue a)
initQueueFromBuffer2 Data Index
len Arr a
buf
where
len :: Data Index
len = vec -> Data Index
forall a. Finite a => a -> Data Index
length vec
init
newQueue2 :: (Syntax a, MonadComp m)
=> Data Length
-> m (Queue a)
newQueue2 :: Data Index -> m (Queue a)
newQueue2 Data Index
l = do
Arr a
buf <- Data Index -> m (Arr a)
forall a (m :: * -> *).
(Type (Internal a), MonadComp m) =>
Data Index -> m (Arr a)
newArr (Data Index
2Data Index -> Data Index -> Data Index
forall a. Num a => a -> a -> a
*Data Index
l)
Data Index -> Arr a -> m (Queue a)
forall (m :: * -> *) a.
(Syntax a, MonadComp m) =>
Data Index -> Arr a -> m (Queue a)
initQueueFromBuffer2 Data Index
l Arr a
buf