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