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'