module Data.Tensort.Utils.Render (getSortedBitsFromTensor) where
import Data.Maybe (isNothing)
import Data.Tensort.Utils.Compose (createTensor)
import Data.Tensort.Utils.Types
( Bit,
BitR,
Memory (..),
MemoryR (..),
SBit (..),
SMemory (..),
STensor (..),
STensorStack,
SortAlg,
Sortable (..),
Tensor,
TensorR,
TensorStack,
TensorStackR,
fromJust,
fromSTensorBit,
fromSTensorRec,
fromSortBit,
fromSortRec,
)
getSortedBitsFromTensor :: SortAlg -> STensorStack -> [SBit]
getSortedBitsFromTensor :: SortAlg -> STensorStack -> [SBit]
getSortedBitsFromTensor SortAlg
subAlg (STensorBit Tensor
tensorRaw) =
SortAlg -> Tensor -> [SBit]
getSortedBitsFromTensorB SortAlg
subAlg Tensor
tensorRaw
getSortedBitsFromTensor SortAlg
subAlg (STensorRec TensorR
tensorRaw) =
SortAlg -> TensorR -> [SBit]
getSortedBitsFromTensorR SortAlg
subAlg TensorR
tensorRaw
getSortedBitsFromTensorB :: SortAlg -> TensorStack -> [SBit]
getSortedBitsFromTensorB :: SortAlg -> Tensor -> [SBit]
getSortedBitsFromTensorB SortAlg
subAlg Tensor
tensorRaw = Tensor -> [SBit] -> [SBit]
acc Tensor
tensorRaw []
where
acc :: TensorStack -> [SBit] -> [SBit]
acc :: Tensor -> [SBit] -> [SBit]
acc Tensor
tensor [SBit]
sortedBits = do
let (Int
nextBit, Maybe Tensor
tensor') = SortAlg -> Tensor -> (Int, Maybe Tensor)
removeTopBitFromTensor SortAlg
subAlg Tensor
tensor
let nextBit' :: SBit
nextBit' = Int -> SBit
SBitBit Int
nextBit
if Maybe Tensor -> Bool
forall a. Maybe a -> Bool
isNothing Maybe Tensor
tensor'
then SBit
nextBit' SBit -> [SBit] -> [SBit]
forall a. a -> [a] -> [a]
: [SBit]
sortedBits
else do
Tensor -> [SBit] -> [SBit]
acc (Maybe Tensor -> Tensor
forall a. Maybe a -> a
fromJust Maybe Tensor
tensor') (SBit
nextBit' SBit -> [SBit] -> [SBit]
forall a. a -> [a] -> [a]
: [SBit]
sortedBits)
getSortedBitsFromTensorR :: SortAlg -> TensorStackR -> [SBit]
getSortedBitsFromTensorR :: SortAlg -> TensorR -> [SBit]
getSortedBitsFromTensorR SortAlg
subAlg TensorR
tensorRaw = TensorR -> [SBit] -> [SBit]
acc TensorR
tensorRaw []
where
acc :: TensorStackR -> [SBit] -> [SBit]
acc :: TensorR -> [SBit] -> [SBit]
acc TensorR
tensor [SBit]
sortedBits = do
let (BitR
nextBit, Maybe TensorR
tensor') = SortAlg -> TensorR -> (BitR, Maybe TensorR)
removeTopBitFromTensorR SortAlg
subAlg TensorR
tensor
let nextBit' :: SBit
nextBit' = BitR -> SBit
SBitRec BitR
nextBit
if Maybe TensorR -> Bool
forall a. Maybe a -> Bool
isNothing Maybe TensorR
tensor'
then SBit
nextBit' SBit -> [SBit] -> [SBit]
forall a. a -> [a] -> [a]
: [SBit]
sortedBits
else do
TensorR -> [SBit] -> [SBit]
acc (Maybe TensorR -> TensorR
forall a. Maybe a -> a
fromJust Maybe TensorR
tensor') (SBit
nextBit' SBit -> [SBit] -> [SBit]
forall a. a -> [a] -> [a]
: [SBit]
sortedBits)
removeTopBitFromTensor :: SortAlg -> Tensor -> (Bit, Maybe Tensor)
removeTopBitFromTensor :: SortAlg -> Tensor -> (Int, Maybe Tensor)
removeTopBitFromTensor SortAlg
subAlg (Register
register, Memory
memory) = do
let topRecord :: BitR
topRecord = Register -> BitR
forall a. HasCallStack => [a] -> a
last Register
register
let topAddress :: Int
topAddress = BitR -> Int
forall a b. (a, b) -> a
fst BitR
topRecord
let (Int
topBit, Maybe Memory
memory') = SortAlg -> Memory -> Int -> (Int, Maybe Memory)
removeBitFromMemory SortAlg
subAlg Memory
memory Int
topAddress
if Maybe Memory -> Bool
forall a. Maybe a -> Bool
isNothing Maybe Memory
memory'
then (Int
topBit, Maybe Tensor
forall a. Maybe a
Nothing)
else
( Int
topBit,
Tensor -> Maybe Tensor
forall a. a -> Maybe a
Just
( STensorStack -> Tensor
fromSTensorBit
( SortAlg -> SMemory -> STensorStack
createTensor
SortAlg
subAlg
(Memory -> SMemory
SMemoryBit (Maybe Memory -> Memory
forall a. Maybe a -> a
fromJust Maybe Memory
memory'))
)
)
)
removeTopBitFromTensorR :: SortAlg -> TensorR -> (BitR, Maybe TensorR)
removeTopBitFromTensorR :: SortAlg -> TensorR -> (BitR, Maybe TensorR)
removeTopBitFromTensorR SortAlg
subAlg (RegisterR
register, MemoryR
memory) = do
let topRecord :: RecordR
topRecord = RegisterR -> RecordR
forall a. HasCallStack => [a] -> a
last RegisterR
register
let topAddress :: Int
topAddress = RecordR -> Int
forall a b. (a, b) -> a
fst RecordR
topRecord
let (BitR
topBit, Maybe MemoryR
memory') = SortAlg -> MemoryR -> Int -> (BitR, Maybe MemoryR)
removeBitFromMemoryR SortAlg
subAlg MemoryR
memory Int
topAddress
if Maybe MemoryR -> Bool
forall a. Maybe a -> Bool
isNothing Maybe MemoryR
memory'
then (BitR
topBit, Maybe TensorR
forall a. Maybe a
Nothing)
else
( BitR
topBit,
TensorR -> Maybe TensorR
forall a. a -> Maybe a
Just
( STensorStack -> TensorR
fromSTensorRec
( SortAlg -> SMemory -> STensorStack
createTensor
SortAlg
subAlg
(MemoryR -> SMemory
SMemoryRec (Maybe MemoryR -> MemoryR
forall a. Maybe a -> a
fromJust Maybe MemoryR
memory'))
)
)
)
removeBitFromMemory :: SortAlg -> Memory -> Int -> (Bit, Maybe Memory)
removeBitFromMemory :: SortAlg -> Memory -> Int -> (Int, Maybe Memory)
removeBitFromMemory SortAlg
subAlg (ByteMem [Byte]
bytes) Int
i = do
let topByte :: Byte
topByte = [Byte]
bytes [Byte] -> Int -> Byte
forall a. HasCallStack => [a] -> Int -> a
!! Int
i
let topBit :: Int
topBit = Byte -> Int
forall a. HasCallStack => [a] -> a
last Byte
topByte
let topByte' :: Byte
topByte' = Byte -> Byte
forall a. HasCallStack => [a] -> [a]
init Byte
topByte
case Byte -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length Byte
topByte' of
Int
0 -> do
let bytes' :: [Byte]
bytes' = Int -> [Byte] -> [Byte]
forall a. Int -> [a] -> [a]
take Int
i [Byte]
bytes [Byte] -> [Byte] -> [Byte]
forall a. [a] -> [a] -> [a]
++ Int -> [Byte] -> [Byte]
forall a. Int -> [a] -> [a]
drop (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [Byte]
bytes
if [Byte] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Byte]
bytes'
then (Int
topBit, Maybe Memory
forall a. Maybe a
Nothing)
else (Int
topBit, Memory -> Maybe Memory
forall a. a -> Maybe a
Just ([Byte] -> Memory
ByteMem [Byte]
bytes'))
Int
1 -> do
let bytes' :: [Byte]
bytes' = Int -> [Byte] -> [Byte]
forall a. Int -> [a] -> [a]
take Int
i [Byte]
bytes [Byte] -> [Byte] -> [Byte]
forall a. [a] -> [a] -> [a]
++ [Byte
topByte'] [Byte] -> [Byte] -> [Byte]
forall a. [a] -> [a] -> [a]
++ Int -> [Byte] -> [Byte]
forall a. Int -> [a] -> [a]
drop (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [Byte]
bytes
(Int
topBit, Memory -> Maybe Memory
forall a. a -> Maybe a
Just ([Byte] -> Memory
ByteMem [Byte]
bytes'))
Int
_ -> do
let topByte'' :: Byte
topByte'' = Sortable -> Byte
fromSortBit (SortAlg
subAlg (Byte -> Sortable
SortBit Byte
topByte'))
let bytes' :: [Byte]
bytes' = Int -> [Byte] -> [Byte]
forall a. Int -> [a] -> [a]
take Int
i [Byte]
bytes [Byte] -> [Byte] -> [Byte]
forall a. [a] -> [a] -> [a]
++ [Byte
topByte''] [Byte] -> [Byte] -> [Byte]
forall a. [a] -> [a] -> [a]
++ Int -> [Byte] -> [Byte]
forall a. Int -> [a] -> [a]
drop (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [Byte]
bytes
(Int
topBit, Memory -> Maybe Memory
forall a. a -> Maybe a
Just ([Byte] -> Memory
ByteMem [Byte]
bytes'))
removeBitFromMemory SortAlg
subAlg (TensorMem [Tensor]
tensors) Int
i = do
let topTensor :: Tensor
topTensor = [Tensor]
tensors [Tensor] -> Int -> Tensor
forall a. HasCallStack => [a] -> Int -> a
!! Int
i
let (Int
topBit, Maybe Tensor
topTensor') = SortAlg -> Tensor -> (Int, Maybe Tensor)
removeTopBitFromTensor SortAlg
subAlg Tensor
topTensor
if Maybe Tensor -> Bool
forall a. Maybe a -> Bool
isNothing Maybe Tensor
topTensor'
then do
let tensors' :: [Tensor]
tensors' = Int -> [Tensor] -> [Tensor]
forall a. Int -> [a] -> [a]
take Int
i [Tensor]
tensors [Tensor] -> [Tensor] -> [Tensor]
forall a. [a] -> [a] -> [a]
++ Int -> [Tensor] -> [Tensor]
forall a. Int -> [a] -> [a]
drop (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [Tensor]
tensors
if [Tensor] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Tensor]
tensors'
then (Int
topBit, Maybe Memory
forall a. Maybe a
Nothing)
else (Int
topBit, Memory -> Maybe Memory
forall a. a -> Maybe a
Just ([Tensor] -> Memory
TensorMem [Tensor]
tensors'))
else do
let tensors' :: [Tensor]
tensors' =
Int -> [Tensor] -> [Tensor]
forall a. Int -> [a] -> [a]
take Int
i [Tensor]
tensors [Tensor] -> [Tensor] -> [Tensor]
forall a. [a] -> [a] -> [a]
++ [Maybe Tensor -> Tensor
forall a. Maybe a -> a
fromJust Maybe Tensor
topTensor'] [Tensor] -> [Tensor] -> [Tensor]
forall a. [a] -> [a] -> [a]
++ Int -> [Tensor] -> [Tensor]
forall a. Int -> [a] -> [a]
drop (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [Tensor]
tensors
(Int
topBit, Memory -> Maybe Memory
forall a. a -> Maybe a
Just ([Tensor] -> Memory
TensorMem [Tensor]
tensors'))
removeBitFromMemoryR :: SortAlg -> MemoryR -> Int -> (BitR, Maybe MemoryR)
removeBitFromMemoryR :: SortAlg -> MemoryR -> Int -> (BitR, Maybe MemoryR)
removeBitFromMemoryR SortAlg
subAlg (ByteMemR [Register]
bytesR) Int
i = do
let topByteR :: Register
topByteR = [Register]
bytesR [Register] -> Int -> Register
forall a. HasCallStack => [a] -> Int -> a
!! Int
i
let topBitR :: BitR
topBitR = Register -> BitR
forall a. HasCallStack => [a] -> a
last Register
topByteR
let topByteR' :: Register
topByteR' = Register -> Register
forall a. HasCallStack => [a] -> [a]
init Register
topByteR
case Register -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length Register
topByteR' of
Int
0 -> do
let bytesR' :: [Register]
bytesR' = Int -> [Register] -> [Register]
forall a. Int -> [a] -> [a]
take Int
i [Register]
bytesR [Register] -> [Register] -> [Register]
forall a. [a] -> [a] -> [a]
++ Int -> [Register] -> [Register]
forall a. Int -> [a] -> [a]
drop (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [Register]
bytesR
if [Register] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Register]
bytesR'
then (BitR
topBitR, Maybe MemoryR
forall a. Maybe a
Nothing)
else (BitR
topBitR, MemoryR -> Maybe MemoryR
forall a. a -> Maybe a
Just ([Register] -> MemoryR
ByteMemR [Register]
bytesR'))
Int
1 -> do
let bytesR' :: [Register]
bytesR' = Int -> [Register] -> [Register]
forall a. Int -> [a] -> [a]
take Int
i [Register]
bytesR [Register] -> [Register] -> [Register]
forall a. [a] -> [a] -> [a]
++ [Register
topByteR'] [Register] -> [Register] -> [Register]
forall a. [a] -> [a] -> [a]
++ Int -> [Register] -> [Register]
forall a. Int -> [a] -> [a]
drop (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [Register]
bytesR
(BitR
topBitR, MemoryR -> Maybe MemoryR
forall a. a -> Maybe a
Just ([Register] -> MemoryR
ByteMemR [Register]
bytesR'))
Int
_ -> do
let topByteR'' :: Register
topByteR'' = Sortable -> Register
fromSortRec (SortAlg
subAlg (Register -> Sortable
SortRec Register
topByteR'))
let bytesR' :: [Register]
bytesR' = Int -> [Register] -> [Register]
forall a. Int -> [a] -> [a]
take Int
i [Register]
bytesR [Register] -> [Register] -> [Register]
forall a. [a] -> [a] -> [a]
++ [Register
topByteR''] [Register] -> [Register] -> [Register]
forall a. [a] -> [a] -> [a]
++ Int -> [Register] -> [Register]
forall a. Int -> [a] -> [a]
drop (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [Register]
bytesR
(BitR
topBitR, MemoryR -> Maybe MemoryR
forall a. a -> Maybe a
Just ([Register] -> MemoryR
ByteMemR [Register]
bytesR'))
removeBitFromMemoryR SortAlg
subAlg (TensorMemR [TensorR]
tensorsR) Int
i = do
let topTensorR :: TensorR
topTensorR = [TensorR]
tensorsR [TensorR] -> Int -> TensorR
forall a. HasCallStack => [a] -> Int -> a
!! Int
i
let (BitR
topBitR, Maybe TensorR
topTensorR') = SortAlg -> TensorR -> (BitR, Maybe TensorR)
removeTopBitFromTensorR SortAlg
subAlg TensorR
topTensorR
if Maybe TensorR -> Bool
forall a. Maybe a -> Bool
isNothing Maybe TensorR
topTensorR'
then do
let tensorsR' :: [TensorR]
tensorsR' = Int -> [TensorR] -> [TensorR]
forall a. Int -> [a] -> [a]
take Int
i [TensorR]
tensorsR [TensorR] -> [TensorR] -> [TensorR]
forall a. [a] -> [a] -> [a]
++ Int -> [TensorR] -> [TensorR]
forall a. Int -> [a] -> [a]
drop (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [TensorR]
tensorsR
if [TensorR] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [TensorR]
tensorsR'
then (BitR
topBitR, Maybe MemoryR
forall a. Maybe a
Nothing)
else (BitR
topBitR, MemoryR -> Maybe MemoryR
forall a. a -> Maybe a
Just ([TensorR] -> MemoryR
TensorMemR [TensorR]
tensorsR'))
else do
let tensorsR' :: [TensorR]
tensorsR' =
Int -> [TensorR] -> [TensorR]
forall a. Int -> [a] -> [a]
take Int
i [TensorR]
tensorsR [TensorR] -> [TensorR] -> [TensorR]
forall a. [a] -> [a] -> [a]
++ [Maybe TensorR -> TensorR
forall a. Maybe a -> a
fromJust Maybe TensorR
topTensorR'] [TensorR] -> [TensorR] -> [TensorR]
forall a. [a] -> [a] -> [a]
++ Int -> [TensorR] -> [TensorR]
forall a. Int -> [a] -> [a]
drop (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [TensorR]
tensorsR
(BitR
topBitR, MemoryR -> Maybe MemoryR
forall a. a -> Maybe a
Just ([TensorR] -> MemoryR
TensorMemR [TensorR]
tensorsR'))