{-# LANGUAGE DeriveFunctor #-}

module Asm.BB ( BB (..) ) where

import           Data.Copointed

data BB arch reg freg f2reg a b = BB { forall (arch :: * -> * -> * -> * -> *) reg freg f2reg a b.
BB arch reg freg f2reg a b -> [arch reg freg f2reg a]
unBB :: [arch reg freg f2reg a], forall (arch :: * -> * -> * -> * -> *) reg freg f2reg a b.
BB arch reg freg f2reg a b -> b
caBB :: b } deriving ((forall a b.
 (a -> b)
 -> BB arch reg freg f2reg a a -> BB arch reg freg f2reg a b)
-> (forall a b.
    a -> BB arch reg freg f2reg a b -> BB arch reg freg f2reg a a)
-> Functor (BB arch reg freg f2reg a)
forall a b.
a -> BB arch reg freg f2reg a b -> BB arch reg freg f2reg a a
forall a b.
(a -> b)
-> BB arch reg freg f2reg a a -> BB arch reg freg f2reg a b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
forall (arch :: * -> * -> * -> * -> *) reg freg f2reg a a b.
a -> BB arch reg freg f2reg a b -> BB arch reg freg f2reg a a
forall (arch :: * -> * -> * -> * -> *) reg freg f2reg a a b.
(a -> b)
-> BB arch reg freg f2reg a a -> BB arch reg freg f2reg a b
$cfmap :: forall (arch :: * -> * -> * -> * -> *) reg freg f2reg a a b.
(a -> b)
-> BB arch reg freg f2reg a a -> BB arch reg freg f2reg a b
fmap :: forall a b.
(a -> b)
-> BB arch reg freg f2reg a a -> BB arch reg freg f2reg a b
$c<$ :: forall (arch :: * -> * -> * -> * -> *) reg freg f2reg a a b.
a -> BB arch reg freg f2reg a b -> BB arch reg freg f2reg a a
<$ :: forall a b.
a -> BB arch reg freg f2reg a b -> BB arch reg freg f2reg a a
Functor)

instance Copointed (BB arch reg freg f2reg a) where copoint :: forall a. BB arch reg freg f2reg a a -> a
copoint=BB arch reg freg f2reg a a -> a
forall (arch :: * -> * -> * -> * -> *) reg freg f2reg a b.
BB arch reg freg f2reg a b -> b
caBB