packages feed

atomo-0.1.1: src/Atomo/Kernel/Message.hs

{-# LANGUAGE QuasiQuotes #-}
module Atomo.Kernel.Message (load) where

import Atomo.Environment
import Atomo.Haskell


load :: VM ()
load = do
    [$p|(m: Message) type|] =: do
        Message m <- here "m" >>= findMessage
        case m of
            Single {} -> return (particle "single")
            Keyword {} -> return (particle "keyword")

    [$p|(m: Message) send|] =: do
        Message m <- here "m" >>= findMessage
        dispatch m

    [$p|(m: Message) particle|] =: do
        Message m <- here "m" >>= findMessage
        case m of
            Single { mName = n } -> return (particle n)
            Keyword { mNames = ns } -> return (keyParticle ns (replicate (length ns + 1) Nothing))

    [$p|(m: Message) target|] =: do
        Message (Single { mTarget = t }) <- here "m" >>= findMessage
        return t

    [$p|(m: Message) targets|] =: do
        Message (Keyword { mTargets = ts }) <- here "m" >>= findMessage
        list ts