packages feed

atomo-0.4: src/Atomo/Kernel/Pattern.hs

{-# LANGUAGE QuasiQuotes #-}
{-# OPTIONS -fno-warn-name-shadowing #-}
module Atomo.Kernel.Pattern (load) where

import Atomo
import Atomo.Pattern (match)


load :: VM ()
load = do
    ([$p|Pattern Role|] =::) =<< eval [$e|Pattern clone|]
    ([$p|Pattern Define|] =::) =<< eval [$e|Pattern clone|]

    [$p|(e: Expression) to: Pattern|] =: do
        Expression e <- here "e" >>= findExpression
        p <- toPattern' e
        return (Pattern p)

    [$p|(e: Expression) to: Pattern Role|] =: do
        Expression e <- here "e" >>= findExpression
        p <- toRolePattern' e
        return (Pattern p)

    [$p|(e: Expression) to: Pattern Define|] =: do
        Expression e <- here "e" >>= findExpression
        p <- toDefinePattern' e
        return (Pattern (PMessage p))

    [$p|(p: Pattern) name|] =: do
        Pattern p <- here "p" >>= findPattern

        case p of
            PNamed n _ -> return (string n)
            PMessage (Single { mName = n }) -> return (string n)
            _ -> raise ["no-name-for"] [Pattern p]

    [$p|(p: Pattern) names|] =: do
        Pattern p <- here "p" >>= findPattern

        case p of
            PMessage (Keyword { mNames = ns }) -> return $ list (map string ns)
            _ -> raise ["no-names-for"] [Pattern p]

    [$p|(p: Pattern) target|] =: do
        Pattern p <- here "p" >>= findPattern

        case p of
            PMessage (Single { mTarget = t }) -> return (Pattern t)
            _ -> raise ["no-target-for"] [Pattern p]

    [$p|(p: Pattern) targets|] =: do
        Pattern p <- here "p" >>= findPattern

        case p of
            PMessage (Keyword { mTargets = ts }) -> return $ list (map Pattern ts)
            _ -> raise ["no-targets-for"] [Pattern p]

    [$p|(p: Pattern) match: v|] =: do
        Pattern p <- here "p" >>= findPattern
        v <- here "v"
        ids <- gets primitives

        if match ids Nothing p v
            then do
                bs <- eval [$e|Object clone|]
                withTop bs (set p v)
                return (keyParticleN ["ok"] [bs])
            else return (particle "none")

    [$p|top match: (p: Pattern) on: v|] =: do
        p <- here "p" >>= findPattern >>= matchable' . fromPattern
        v <- here "v"
        t <- here "top"

        case p of
            PMessage m -> define m (EPrimitive Nothing v) >> return v
            _          -> withTop t (set p v)