primArbitrary
this uses some awesome type magic. leave code commentary later.
This commit is contained in:
40
src/TIM.hs
40
src/TIM.hs
@@ -11,10 +11,11 @@ import Data.Set qualified as S
|
|||||||
import Data.Maybe (fromJust, fromMaybe)
|
import Data.Maybe (fromJust, fromMaybe)
|
||||||
import Data.List (mapAccumL, intersperse)
|
import Data.List (mapAccumL, intersperse)
|
||||||
import Control.Monad (guard)
|
import Control.Monad (guard)
|
||||||
import Data.Foldable (traverse_)
|
import Data.Foldable (traverse_, find)
|
||||||
import Data.Function ((&))
|
import Data.Function ((&))
|
||||||
import System.IO (Handle, hPutStr)
|
import System.IO (Handle, hPutStr)
|
||||||
import Text.Printf (printf)
|
import Text.Printf (printf)
|
||||||
|
import Data.Proxy (Proxy(..))
|
||||||
import Data.Pretty
|
import Data.Pretty
|
||||||
import Data.Heap
|
import Data.Heap
|
||||||
import Core
|
import Core
|
||||||
@@ -268,6 +269,43 @@ step st =
|
|||||||
|
|
||||||
dataStep _ _ _ = error "data applied as function..."
|
dataStep _ _ _ = error "data applied as function..."
|
||||||
|
|
||||||
|
primArbitrary :: forall a. (PrimArbitraryType a) => a -> TiState -> TiState
|
||||||
|
primArbitrary f (TiState s d h g sts) =
|
||||||
|
TiState s' d' h' g sts
|
||||||
|
where
|
||||||
|
s' = case unevaled of
|
||||||
|
Just (_,a) -> [a]
|
||||||
|
Nothing -> drop ar s
|
||||||
|
d' = case unevaled of
|
||||||
|
Just (i,_) -> drop i s : d
|
||||||
|
Nothing -> d
|
||||||
|
h' = case unevaled of
|
||||||
|
Just _ -> h
|
||||||
|
Nothing -> update h rootAddr $
|
||||||
|
onList f (fmap (\a -> hLookupUnsafe a h) argAddrs)
|
||||||
|
|
||||||
|
unevaled = find (\ (_,a) -> needsEval $ hLookupUnsafe a h) ans
|
||||||
|
ans = [1..] `zip` argAddrs
|
||||||
|
needsEval = not . isDataNode
|
||||||
|
argAddrs = getArgs h s
|
||||||
|
rootAddr = s !! ar
|
||||||
|
ar = arity (Proxy @a)
|
||||||
|
|
||||||
|
class PrimArbitraryType a where
|
||||||
|
-- primArbitrary' :: a -> TiState -> TiState
|
||||||
|
arity :: Proxy a -> Int
|
||||||
|
-- runArb :: Node -> a
|
||||||
|
onList :: a -> [Node] -> Node
|
||||||
|
|
||||||
|
instance PrimArbitraryType Node where
|
||||||
|
arity _ = 0
|
||||||
|
onList n [] = n
|
||||||
|
onList _ _ = error "arity and list length do not match!"
|
||||||
|
|
||||||
|
instance (PrimArbitraryType a) => PrimArbitraryType (Node -> a) where
|
||||||
|
arity _ = 1 + arity (Proxy @a)
|
||||||
|
onList nf (a:as) = onList (nf a) as
|
||||||
|
|
||||||
primBinary :: (Node -> Node -> Node) -> TiState -> TiState
|
primBinary :: (Node -> Node -> Node) -> TiState -> TiState
|
||||||
primBinary f (TiState s d h g sts) =
|
primBinary f (TiState s d h g sts) =
|
||||||
TiState s' d' h' g sts
|
TiState s' d' h' g sts
|
||||||
|
|||||||
Reference in New Issue
Block a user