{-# LANGUAGE FlexibleContexts #-}

module Asm.LI ( mkIntervals ) where

import           Asm.Ar
import           Asm.L
import           CF
import           Data.Copointed
import           LI

mkIntervals :: (Arch arch reg freg f2, Copointed (arch reg freg f2)) => [arch reg freg f2 ()] -> [arch reg freg f2 Live]
mkIntervals :: forall (arch :: * -> * -> * -> * -> *) reg freg f2.
(Arch arch reg freg f2, Copointed (arch reg freg f2)) =>
[arch reg freg f2 ()] -> [arch reg freg f2 Live]
mkIntervals = [arch reg freg f2 NLiveness] -> [arch reg freg f2 Live]
forall (p :: * -> *). Copointed p => [p NLiveness] -> [p Live]
intervals ([arch reg freg f2 NLiveness] -> [arch reg freg f2 Live])
-> ([arch reg freg f2 ()] -> [arch reg freg f2 NLiveness])
-> [arch reg freg f2 ()]
-> [arch reg freg f2 Live]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [arch reg freg f2 Liveness] -> [arch reg freg f2 NLiveness]
enliven ([arch reg freg f2 Liveness] -> [arch reg freg f2 NLiveness])
-> ([arch reg freg f2 ()] -> [arch reg freg f2 Liveness])
-> [arch reg freg f2 ()]
-> [arch reg freg f2 NLiveness]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [arch reg freg f2 ()] -> [arch reg freg f2 Liveness]
forall (arch :: * -> * -> * -> * -> *) reg freg f2.
Arch arch reg freg f2 =>
[arch reg freg f2 ()] -> [arch reg freg f2 Liveness]
mkLive
    where enliven :: [arch reg freg f2 Liveness] -> [arch reg freg f2 NLiveness]
enliven = (Int -> arch reg freg f2 Liveness -> arch reg freg f2 NLiveness)
-> [Int]
-> [arch reg freg f2 Liveness]
-> [arch reg freg f2 NLiveness]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\Int
n arch reg freg f2 Liveness
a -> (Liveness -> NLiveness)
-> arch reg freg f2 Liveness -> arch reg freg f2 NLiveness
forall a b. (a -> b) -> arch reg freg f2 a -> arch reg freg f2 b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Int -> Liveness -> NLiveness
NLiveness Int
n) arch reg freg f2 Liveness
a) [Int
0..]