packages feed

alms-0.4.9: src/Basis/Thread.hs

{-# LANGUAGE
      DeriveDataTypeable,
      QuasiQuotes #-}
module Basis.Thread (entries) where

import BasisUtils
import Syntax
import Value (Vinj(..))

import qualified Loc
import qualified Syntax.Notable
import qualified Syntax.Decl

import qualified Control.Concurrent as CC

entries :: [Entry Raw]
entries =  [
    -- Threads
    dec [$dc| type thread |],
    fun "fork"  -: [$ty| (unit -> unit) -> thread |]
      -= \f -> Vinj `fmap` CC.forkIO (vapp f () >> return ()),
    fun "kill"  -: [$ty| thread -> unit |]
      -= CC.killThread . unVinj,
    fun "delay" -: [$ty| int -> unit |]
      -= CC.threadDelay . (fromIntegral :: Integer -> Int),
    fun "print" -: [$ty| thread -> thread |]
      -= \t -> do print (t :: Vinj CC.ThreadId); return t
  ]