module Data.Tensort.Utils.SimplifyRegister
  ( simplifyRegister,
    applySortingFromSimplifiedRegister,
  )
where

import qualified Data.Bifunctor
import Data.Tensort.Utils.Types (Record, RecordR)

simplifyRegister :: [RecordR] -> [Record]
simplifyRegister :: [RecordR] -> [Record]
simplifyRegister = (RecordR -> Record) -> [RecordR] -> [Record]
forall a b. (a -> b) -> [a] -> [b]
map ((Record -> TopBit) -> RecordR -> Record
forall b c a. (b -> c) -> (a, b) -> (a, c)
forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
Data.Bifunctor.second Record -> TopBit
forall a b. (a, b) -> b
snd)

applySortingFromSimplifiedRegister :: [Record] -> [RecordR] -> [RecordR]
applySortingFromSimplifiedRegister :: [Record] -> [RecordR] -> [RecordR]
applySortingFromSimplifiedRegister [Record]
sortedSimplifiedRegister [RecordR]
unsortedRegiserR = do
  let registerR :: [RecordR]
registerR = [Record] -> [RecordR] -> [RecordR] -> [RecordR]
acc [Record]
sortedSimplifiedRegister [] [RecordR]
unsortedRegiserR
  [RecordR]
registerR
  where
    acc :: [Record] -> [RecordR] -> [RecordR] -> [RecordR]
    acc :: [Record] -> [RecordR] -> [RecordR] -> [RecordR]
acc [] [RecordR]
sortedRegisterR [RecordR]
_ = [RecordR]
sortedRegisterR
    acc (Record
record : [Record]
remainingRecords) [RecordR]
sortedRegisterR [RecordR]
unsortedRegiserR' = do
      let i :: TopBit
i = Record -> TopBit
forall a b. (a, b) -> a
fst Record
record
      let recordR :: RecordR
recordR = [RecordR] -> RecordR
forall a. HasCallStack => [a] -> a
head ((RecordR -> Bool) -> [RecordR] -> [RecordR]
forall a. (a -> Bool) -> [a] -> [a]
filter (\(TopBit
i', Record
_) -> TopBit
i' TopBit -> TopBit -> Bool
forall a. Eq a => a -> a -> Bool
== TopBit
i) [RecordR]
unsortedRegiserR')
      [Record] -> [RecordR] -> [RecordR] -> [RecordR]
acc [Record]
remainingRecords ([RecordR]
sortedRegisterR [RecordR] -> [RecordR] -> [RecordR]
forall a. [a] -> [a] -> [a]
++ [RecordR
recordR]) [RecordR]
unsortedRegiserR'