module Test.Credit.Deque.Realtime where

import Prelude hiding (lookup, reverse)

import Prettyprinter (Pretty)
import Control.Monad.Credit
import Test.Credit.Deque.Base
import Test.Credit.Deque.Streams

-- | Delay a computation, but do not consume any credits
indirect :: MonadInherit m => SLazyCon m (Stream m a) -> m (Stream m a)
indirect :: forall (m :: * -> *) a.
MonadInherit m =>
SLazyCon m (Stream m a) -> m (Stream m a)
indirect SLazyCon m (Stream m a)
t = SLazyCon m (Stream m a) -> m (Thunk m (SLazyCon m) (Stream m a))
forall (m :: * -> *) (t :: * -> *) a.
MonadLazy m =>
t a -> m (Thunk m t a)
forall (t :: * -> *) a. t a -> m (Thunk m t a)
delay SLazyCon m (Stream m a)
t m (Thunk m (SLazyCon m) (Stream m a))
-> (Thunk m (SLazyCon m) (Stream m a) -> m (Stream m a))
-> m (Stream m a)
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Stream m a -> m (Stream m a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Stream m a -> m (Stream m a))
-> (Thunk m (SLazyCon m) (Stream m a) -> Stream m a)
-> Thunk m (SLazyCon m) (Stream m a)
-> m (Stream m a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Thunk m (SLazyCon m) (Stream m a) -> Stream m a
forall (m :: * -> *) a. SThunk m (Stream m a) -> Stream m a
SIndirect

data RDeque a m = RDeque
  { forall a (m :: * -> *). RDeque a m -> Int
lenf :: !Int
  , forall a (m :: * -> *). RDeque a m -> Stream m a
front :: Stream m a
  , forall a (m :: * -> *). RDeque a m -> Stream m a
sf :: Stream m a
  , forall a (m :: * -> *). RDeque a m -> Int
lenr :: !Int
  , forall a (m :: * -> *). RDeque a m -> Stream m a
rear :: Stream m a
  , forall a (m :: * -> *). RDeque a m -> Stream m a
sr :: Stream m a
  }

exec1 :: MonadInherit m => Stream m a -> m (Stream m a)
exec1 :: forall (m :: * -> *) a.
MonadInherit m =>
Stream m a -> m (Stream m a)
exec1 Stream m a
xs = Credit -> Stream m a -> m ()
forall (m :: * -> *) a.
MonadInherit m =>
Credit -> Stream m a -> m ()
credit (Int -> Credit
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
c Credit -> Credit -> Credit
forall a. Num a => a -> a -> a
+ Credit
1) Stream m a
xs m () -> m (Stream m a) -> m (Stream m a)
forall a b. m a -> m b -> m b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Stream m a
-> (a -> Stream m a -> m (Stream m a))
-> m (Stream m a)
-> m (Stream m a)
forall (m :: * -> *) a b.
MonadInherit m =>
Stream m a -> (a -> Stream m a -> m b) -> m b -> m b
smatch Stream m a
xs
  (\a
_ Stream m a
xs -> Stream m a -> m (Stream m a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Stream m a
xs)
  (Stream m a -> m (Stream m a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Stream m a
forall (m :: * -> *) a. Stream m a
SNil)

exec2 :: MonadInherit m => Stream m a -> m (Stream m a)
exec2 :: forall (m :: * -> *) a.
MonadInherit m =>
Stream m a -> m (Stream m a)
exec2 Stream m a
xs = Stream m a -> m (Stream m a)
forall (m :: * -> *) a.
MonadInherit m =>
Stream m a -> m (Stream m a)
exec1 Stream m a
xs m (Stream m a) -> (Stream m a -> m (Stream m a)) -> m (Stream m a)
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Stream m a -> m (Stream m a)
forall (m :: * -> *) a.
MonadInherit m =>
Stream m a -> m (Stream m a)
exec1

rdeque :: MonadInherit m => RDeque a m -> m (RDeque a m)
rdeque :: forall (m :: * -> *) a.
MonadInherit m =>
RDeque a m -> m (RDeque a m)
rdeque (RDeque Int
lenf Stream m a
f Stream m a
sf Int
lenr Stream m a
r Stream m a
sr)
  | Int
lenf Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
c Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
lenr Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1 = do
    let i :: Int
i = (Int
lenf Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
lenr) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
2
    let j :: Int
j = Int
lenf Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
lenr Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
i
    Stream m a
f' <- SLazyCon m (Stream m a) -> m (Stream m a)
forall (m :: * -> *) a.
MonadInherit m =>
SLazyCon m (Stream m a) -> m (Stream m a)
indirect (Int -> Stream m a -> SLazyCon m (Stream m a)
forall (m :: * -> *) a1.
Int -> Stream m a1 -> SLazyCon m (Stream m a1)
STake Int
i Stream m a
f)
    Stream m a
f'' <- SLazyCon m (Stream m a) -> m (Stream m a)
forall (m :: * -> *) a.
MonadInherit m =>
SLazyCon m (Stream m a) -> m (Stream m a)
indirect (Int -> Stream m a -> Stream m a -> SLazyCon m (Stream m a)
forall (m :: * -> *) a1.
Int -> Stream m a1 -> Stream m a1 -> SLazyCon m (Stream m a1)
SRevDrop Int
i Stream m a
f Stream m a
forall (m :: * -> *) a. Stream m a
SNil)
    Stream m a
r' <- SLazyCon m (Stream m a) -> m (Stream m a)
forall (m :: * -> *) a.
MonadInherit m =>
SLazyCon m (Stream m a) -> m (Stream m a)
indirect (Stream m a -> Stream m a -> SLazyCon m (Stream m a)
forall (m :: * -> *) a1.
Stream m a1 -> Stream m a1 -> SLazyCon m (Stream m a1)
SAppend Stream m a
r Stream m a
f'')
    Credit -> Stream m a -> m ()
forall (m :: * -> *) a.
MonadInherit m =>
Credit -> Stream m a -> m ()
credit (Int -> Credit
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
c) Stream m a
f'' m () -> m () -> m ()
forall a b. m a -> m b -> m b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Int -> Stream m a -> m ()
forall (m :: * -> *) a. MonadInherit m => Int -> Stream m a -> m ()
eval (Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
c) Stream m a
f''
    RDeque a m -> m (RDeque a m)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (RDeque a m -> m (RDeque a m)) -> RDeque a m -> m (RDeque a m)
forall a b. (a -> b) -> a -> b
$ Int
-> Stream m a
-> Stream m a
-> Int
-> Stream m a
-> Stream m a
-> RDeque a m
forall a (m :: * -> *).
Int
-> Stream m a
-> Stream m a
-> Int
-> Stream m a
-> Stream m a
-> RDeque a m
RDeque Int
i Stream m a
f' Stream m a
f' Int
j Stream m a
r' Stream m a
r'
  | Int
lenr Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
c Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
lenf Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1 = do
    let j :: Int
j = (Int
lenf Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
lenr) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
2
    let i :: Int
i = Int
lenf Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
lenr Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
j
    Stream m a
r' <- SLazyCon m (Stream m a) -> m (Stream m a)
forall (m :: * -> *) a.
MonadInherit m =>
SLazyCon m (Stream m a) -> m (Stream m a)
indirect (Int -> Stream m a -> SLazyCon m (Stream m a)
forall (m :: * -> *) a1.
Int -> Stream m a1 -> SLazyCon m (Stream m a1)
STake Int
j Stream m a
r)
    Stream m a
r'' <- SLazyCon m (Stream m a) -> m (Stream m a)
forall (m :: * -> *) a.
MonadInherit m =>
SLazyCon m (Stream m a) -> m (Stream m a)
indirect (Int -> Stream m a -> Stream m a -> SLazyCon m (Stream m a)
forall (m :: * -> *) a1.
Int -> Stream m a1 -> Stream m a1 -> SLazyCon m (Stream m a1)
SRevDrop Int
j Stream m a
r Stream m a
forall (m :: * -> *) a. Stream m a
SNil)
    Stream m a
f' <- SLazyCon m (Stream m a) -> m (Stream m a)
forall (m :: * -> *) a.
MonadInherit m =>
SLazyCon m (Stream m a) -> m (Stream m a)
indirect (Stream m a -> Stream m a -> SLazyCon m (Stream m a)
forall (m :: * -> *) a1.
Stream m a1 -> Stream m a1 -> SLazyCon m (Stream m a1)
SAppend Stream m a
f Stream m a
r'')
    Credit -> Stream m a -> m ()
forall (m :: * -> *) a.
MonadInherit m =>
Credit -> Stream m a -> m ()
credit (Int -> Credit
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
c) Stream m a
r'' m () -> m () -> m ()
forall a b. m a -> m b -> m b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Int -> Stream m a -> m ()
forall (m :: * -> *) a. MonadInherit m => Int -> Stream m a -> m ()
eval (Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
c) Stream m a
r''
    RDeque a m -> m (RDeque a m)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (RDeque a m -> m (RDeque a m)) -> RDeque a m -> m (RDeque a m)
forall a b. (a -> b) -> a -> b
$ Int
-> Stream m a
-> Stream m a
-> Int
-> Stream m a
-> Stream m a
-> RDeque a m
forall a (m :: * -> *).
Int
-> Stream m a
-> Stream m a
-> Int
-> Stream m a
-> Stream m a
-> RDeque a m
RDeque Int
i Stream m a
f' Stream m a
f' Int
j Stream m a
r' Stream m a
r'
  | Bool
otherwise =
    RDeque a m -> m (RDeque a m)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (RDeque a m -> m (RDeque a m)) -> RDeque a m -> m (RDeque a m)
forall a b. (a -> b) -> a -> b
$ Int
-> Stream m a
-> Stream m a
-> Int
-> Stream m a
-> Stream m a
-> RDeque a m
forall a (m :: * -> *).
Int
-> Stream m a
-> Stream m a
-> Int
-> Stream m a
-> Stream m a
-> RDeque a m
RDeque Int
lenf Stream m a
f Stream m a
sf Int
lenr Stream m a
r Stream m a
sr

instance Deque RDeque where
  empty :: forall (m :: * -> *) a. MonadInherit m => m (RDeque a m)
empty = RDeque a m -> m (RDeque a m)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (RDeque a m -> m (RDeque a m)) -> RDeque a m -> m (RDeque a m)
forall a b. (a -> b) -> a -> b
$ Int
-> Stream m a
-> Stream m a
-> Int
-> Stream m a
-> Stream m a
-> RDeque a m
forall a (m :: * -> *).
Int
-> Stream m a
-> Stream m a
-> Int
-> Stream m a
-> Stream m a
-> RDeque a m
RDeque Int
0 Stream m a
forall (m :: * -> *) a. Stream m a
SNil Stream m a
forall (m :: * -> *) a. Stream m a
SNil Int
0 Stream m a
forall (m :: * -> *) a. Stream m a
SNil Stream m a
forall (m :: * -> *) a. Stream m a
SNil
  cons :: forall (m :: * -> *) a.
MonadInherit m =>
a -> RDeque a m -> m (RDeque a m)
cons a
x (RDeque Int
lenf Stream m a
f Stream m a
sf Int
lenr Stream m a
r Stream m a
sr) = Stream m a -> m (Stream m a)
forall (m :: * -> *) a.
MonadInherit m =>
Stream m a -> m (Stream m a)
exec1 Stream m a
sf m (Stream m a) -> (Stream m a -> m (RDeque a m)) -> m (RDeque a m)
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Stream m a
sf -> Stream m a -> m (Stream m a)
forall (m :: * -> *) a.
MonadInherit m =>
Stream m a -> m (Stream m a)
exec1 Stream m a
sr m (Stream m a) -> (Stream m a -> m (RDeque a m)) -> m (RDeque a m)
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Stream m a
sr ->
    RDeque a m -> m (RDeque a m)
forall (m :: * -> *) a.
MonadInherit m =>
RDeque a m -> m (RDeque a m)
rdeque (Int
-> Stream m a
-> Stream m a
-> Int
-> Stream m a
-> Stream m a
-> RDeque a m
forall a (m :: * -> *).
Int
-> Stream m a
-> Stream m a
-> Int
-> Stream m a
-> Stream m a
-> RDeque a m
RDeque (Int
lenf Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) (a -> Stream m a -> Stream m a
forall (m :: * -> *) a. a -> Stream m a -> Stream m a
SCons a
x Stream m a
f) Stream m a
sf Int
lenr Stream m a
r Stream m a
sr)
  snoc :: forall (m :: * -> *) a.
MonadInherit m =>
RDeque a m -> a -> m (RDeque a m)
snoc (RDeque Int
lenf Stream m a
f Stream m a
sf Int
lenr Stream m a
r Stream m a
sr) a
x = Stream m a -> m (Stream m a)
forall (m :: * -> *) a.
MonadInherit m =>
Stream m a -> m (Stream m a)
exec1 Stream m a
sf m (Stream m a) -> (Stream m a -> m (RDeque a m)) -> m (RDeque a m)
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Stream m a
sf -> Stream m a -> m (Stream m a)
forall (m :: * -> *) a.
MonadInherit m =>
Stream m a -> m (Stream m a)
exec1 Stream m a
sr m (Stream m a) -> (Stream m a -> m (RDeque a m)) -> m (RDeque a m)
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Stream m a
sr ->
    RDeque a m -> m (RDeque a m)
forall (m :: * -> *) a.
MonadInherit m =>
RDeque a m -> m (RDeque a m)
rdeque (Int
-> Stream m a
-> Stream m a
-> Int
-> Stream m a
-> Stream m a
-> RDeque a m
forall a (m :: * -> *).
Int
-> Stream m a
-> Stream m a
-> Int
-> Stream m a
-> Stream m a
-> RDeque a m
RDeque Int
lenf Stream m a
f Stream m a
sf (Int
lenr Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) (a -> Stream m a -> Stream m a
forall (m :: * -> *) a. a -> Stream m a -> Stream m a
SCons a
x Stream m a
r) Stream m a
sr)
  uncons :: forall (m :: * -> *) a.
MonadInherit m =>
RDeque a m -> m (Maybe (a, RDeque a m))
uncons (RDeque Int
lenf Stream m a
f Stream m a
sf Int
lenr Stream m a
r Stream m a
sr) = Stream m a -> m (Stream m a)
forall (m :: * -> *) a.
MonadInherit m =>
Stream m a -> m (Stream m a)
exec2 Stream m a
sf m (Stream m a)
-> (Stream m a -> m (Maybe (a, RDeque a m)))
-> m (Maybe (a, RDeque a m))
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Stream m a
sf -> Stream m a -> m (Stream m a)
forall (m :: * -> *) a.
MonadInherit m =>
Stream m a -> m (Stream m a)
exec2 Stream m a
sr m (Stream m a)
-> (Stream m a -> m (Maybe (a, RDeque a m)))
-> m (Maybe (a, RDeque a m))
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Stream m a
sr -> Stream m a
-> (a -> Stream m a -> m (Maybe (a, RDeque a m)))
-> m (Maybe (a, RDeque a m))
-> m (Maybe (a, RDeque a m))
forall (m :: * -> *) a b.
MonadInherit m =>
Stream m a -> (a -> Stream m a -> m b) -> m b -> m b
smatch Stream m a
f
    (\a
x Stream m a
f -> RDeque a m -> m (RDeque a m)
forall (m :: * -> *) a.
MonadInherit m =>
RDeque a m -> m (RDeque a m)
rdeque (Int
-> Stream m a
-> Stream m a
-> Int
-> Stream m a
-> Stream m a
-> RDeque a m
forall a (m :: * -> *).
Int
-> Stream m a
-> Stream m a
-> Int
-> Stream m a
-> Stream m a
-> RDeque a m
RDeque (Int
lenf Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Stream m a
f Stream m a
sf Int
lenr Stream m a
r Stream m a
sr) m (RDeque a m)
-> (RDeque a m -> m (Maybe (a, RDeque a m)))
-> m (Maybe (a, RDeque a m))
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \RDeque a m
q -> Maybe (a, RDeque a m) -> m (Maybe (a, RDeque a m))
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe (a, RDeque a m) -> m (Maybe (a, RDeque a m)))
-> Maybe (a, RDeque a m) -> m (Maybe (a, RDeque a m))
forall a b. (a -> b) -> a -> b
$ (a, RDeque a m) -> Maybe (a, RDeque a m)
forall a. a -> Maybe a
Just (a
x, RDeque a m
q))
    (Maybe (a, RDeque a m) -> m (Maybe (a, RDeque a m))
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe (a, RDeque a m)
forall a. Maybe a
Nothing)
  unsnoc :: forall (m :: * -> *) a.
MonadInherit m =>
RDeque a m -> m (Maybe (RDeque a m, a))
unsnoc (RDeque Int
lenf Stream m a
f Stream m a
sf Int
lenr Stream m a
r Stream m a
sr) = Stream m a -> m (Stream m a)
forall (m :: * -> *) a.
MonadInherit m =>
Stream m a -> m (Stream m a)
exec2 Stream m a
sf m (Stream m a)
-> (Stream m a -> m (Maybe (RDeque a m, a)))
-> m (Maybe (RDeque a m, a))
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Stream m a
sf -> Stream m a -> m (Stream m a)
forall (m :: * -> *) a.
MonadInherit m =>
Stream m a -> m (Stream m a)
exec2 Stream m a
sr m (Stream m a)
-> (Stream m a -> m (Maybe (RDeque a m, a)))
-> m (Maybe (RDeque a m, a))
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Stream m a
sr -> Stream m a
-> (a -> Stream m a -> m (Maybe (RDeque a m, a)))
-> m (Maybe (RDeque a m, a))
-> m (Maybe (RDeque a m, a))
forall (m :: * -> *) a b.
MonadInherit m =>
Stream m a -> (a -> Stream m a -> m b) -> m b -> m b
smatch Stream m a
r
    (\a
x Stream m a
r -> RDeque a m -> m (RDeque a m)
forall (m :: * -> *) a.
MonadInherit m =>
RDeque a m -> m (RDeque a m)
rdeque (Int
-> Stream m a
-> Stream m a
-> Int
-> Stream m a
-> Stream m a
-> RDeque a m
forall a (m :: * -> *).
Int
-> Stream m a
-> Stream m a
-> Int
-> Stream m a
-> Stream m a
-> RDeque a m
RDeque Int
lenf Stream m a
f Stream m a
sf (Int
lenr Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Stream m a
r Stream m a
sr) m (RDeque a m)
-> (RDeque a m -> m (Maybe (RDeque a m, a)))
-> m (Maybe (RDeque a m, a))
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \RDeque a m
q -> Maybe (RDeque a m, a) -> m (Maybe (RDeque a m, a))
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe (RDeque a m, a) -> m (Maybe (RDeque a m, a)))
-> Maybe (RDeque a m, a) -> m (Maybe (RDeque a m, a))
forall a b. (a -> b) -> a -> b
$ (RDeque a m, a) -> Maybe (RDeque a m, a)
forall a. a -> Maybe a
Just (RDeque a m
q, a
x))
    (Maybe (RDeque a m, a) -> m (Maybe (RDeque a m, a))
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe (RDeque a m, a)
forall a. Maybe a
Nothing)
  concat :: forall (m :: * -> *) a.
MonadInherit m =>
RDeque a m -> RDeque a m -> m (RDeque a m)
concat = RDeque a m -> RDeque a m -> m (RDeque a m)
forall a. HasCallStack => a
undefined

instance BoundedDeque RDeque where
  qcost :: forall a. Size -> DequeOp a -> Credit
qcost Size
_ (Cons a
_) = Credit
3 Credit -> Credit -> Credit
forall a. Num a => a -> a -> a
* Int -> Credit
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
c Credit -> Credit -> Credit
forall a. Num a => a -> a -> a
+ Credit
4
  qcost Size
_ (Snoc a
_) = Credit
3 Credit -> Credit -> Credit
forall a. Num a => a -> a -> a
* Int -> Credit
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
c Credit -> Credit -> Credit
forall a. Num a => a -> a -> a
+ Credit
4
  qcost Size
_ DequeOp a
Uncons = Credit
5 Credit -> Credit -> Credit
forall a. Num a => a -> a -> a
* Int -> Credit
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
c Credit -> Credit -> Credit
forall a. Num a => a -> a -> a
+ Credit
8
  qcost Size
_ DequeOp a
Unsnoc = Credit
5 Credit -> Credit -> Credit
forall a. Num a => a -> a -> a
* Int -> Credit
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
c Credit -> Credit -> Credit
forall a. Num a => a -> a -> a
+ Credit
8
  qcost Size
_ DequeOp a
Concat = Credit
0

instance (MonadMemory m, MemoryCell m a) => MemoryCell m (RDeque a m) where
  prettyCell :: RDeque a m -> m Memory
prettyCell (RDeque Int
lenf Stream m a
f Stream m a
sf Int
lenr Stream m a
r Stream m a
sr) = do
    Memory
lenf' <- Int -> m Memory
forall (m :: * -> *) a. MemoryCell m a => a -> m Memory
prettyCell Int
lenf
    Memory
f' <- Stream m a -> m Memory
forall (m :: * -> *) a. MemoryCell m a => a -> m Memory
prettyCell Stream m a
f
    Memory
sf' <- Stream m a -> m Memory
forall (m :: * -> *) a. MemoryCell m a => a -> m Memory
prettyCell Stream m a
sf
    Memory
lenr' <- Int -> m Memory
forall (m :: * -> *) a. MemoryCell m a => a -> m Memory
prettyCell Int
lenr
    Memory
r' <- Stream m a -> m Memory
forall (m :: * -> *) a. MemoryCell m a => a -> m Memory
prettyCell Stream m a
r
    Memory
sr' <- Stream m a -> m Memory
forall (m :: * -> *) a. MemoryCell m a => a -> m Memory
prettyCell Stream m a
sr
    Memory -> m Memory
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Memory -> m Memory) -> Memory -> m Memory
forall a b. (a -> b) -> a -> b
$ String -> [Memory] -> Memory
mkMCell String
"Deque" [Memory
lenf', Memory
f', Memory
sf', Memory
lenr', Memory
r', Memory
sr']

instance Pretty a => MemoryStructure (RDeque (PrettyCell a)) where
  prettyStructure :: forall (m :: * -> *).
MonadMemory m =>
RDeque (PrettyCell a) m -> m Memory
prettyStructure = RDeque (PrettyCell a) m -> m Memory
forall (m :: * -> *) a. MemoryCell m a => a -> m Memory
prettyCell