{-# LANGUAGE OverloadedStrings #-}

module Funcons.Operations.Optionals where

import Funcons.Operations.Internal

library :: (HasValues t, Eq t) => Library t
library :: Library t
library = [(OP, ValueOp t)] -> Library t
forall t. [(OP, ValueOp t)] -> Library t
libFromList [
    (OP
"optionals", UnaryExpr t -> ValueOp t
forall t. UnaryExpr t -> ValueOp t
UnaryExpr UnaryExpr t
forall t. HasValues t => OpExpr t -> OpExpr t
optionals)
  , (OP
"none", NullaryExpr t -> ValueOp t
forall t. NullaryExpr t -> ValueOp t
NullaryExpr NullaryExpr t
forall t. HasValues t => OpExpr t
none)
  , (OP
"some", UnaryExpr t -> ValueOp t
forall t. UnaryExpr t -> ValueOp t
UnaryExpr UnaryExpr t
forall t. HasValues t => OpExpr t -> OpExpr t
some)
  ]

toOpt :: HasValues t => Maybe t -> Values t 
toOpt :: Maybe t -> Values t
toOpt (Just t
t)  = Name -> [t] -> Values t
forall t. Name -> [t] -> Values t
ADTVal Name
"some" [t
t]
toOpt Maybe t
Nothing   = Values t
forall t. Values t
none__ 

none__ :: Values t
none__ = Name -> [t] -> Values t
forall t. Name -> [t] -> Values t
ADTVal Name
"none" []

optionals_ :: HasValues t => [OpExpr t] -> OpExpr t
optionals_ :: [OpExpr t] -> OpExpr t
optionals_ = UnaryExpr t -> [OpExpr t] -> OpExpr t
forall t. UnaryExpr t -> [OpExpr t] -> OpExpr t
unaryOp UnaryExpr t
forall t. HasValues t => OpExpr t -> OpExpr t
optionals
optionals :: HasValues t => OpExpr t -> OpExpr t
optionals :: OpExpr t -> OpExpr t
optionals = OP -> UnaryVOp t -> OpExpr t -> OpExpr t
forall t. HasValues t => OP -> UnaryVOp t -> OpExpr t -> OpExpr t
vUnaryOp OP
"optionals" UnaryVOp t
forall t. HasValues t => Values t -> Result t
op
  where op :: Values t -> Result t
op (ComputationType ComputationTypes t
t) = (t -> Result t
forall t. t -> Result t
Normal (t -> Result t) -> t -> Result t
forall a b. (a -> b) -> a -> b
$ Types t -> t
forall t. HasTypes t => Types t -> t
injectT (Types t -> t) -> Types t -> t
forall a b. (a -> b) -> a -> b
$ Name -> [t] -> Types t
forall t. Name -> [t] -> Types t
ADT Name
"optionals" [ComputationTypes t -> t
forall t. HasComputationTypes t => ComputationTypes t -> t
injectCT ComputationTypes t
t])
        op Values t
_        = OP -> Result t
forall t. OP -> Result t
SortErr OP
"optionals not applied to a type"

some__ :: HasValues t => t -> Values t 
some__ :: t -> Values t
some__ = Maybe t -> Values t
forall t. HasValues t => Maybe t -> Values t
toOpt (Maybe t -> Values t) -> (t -> Maybe t) -> t -> Values t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t -> Maybe t
forall a. a -> Maybe a
Just
some_ :: HasValues t => [OpExpr t] -> OpExpr t
some_ :: [OpExpr t] -> OpExpr t
some_ = UnaryExpr t -> [OpExpr t] -> OpExpr t
forall t. UnaryExpr t -> [OpExpr t] -> OpExpr t
unaryOp UnaryExpr t
forall t. HasValues t => OpExpr t -> OpExpr t
some
some :: HasValues t => OpExpr t -> OpExpr t
some :: OpExpr t -> OpExpr t
some = OP -> UnaryVOp t -> OpExpr t -> OpExpr t
forall t. HasValues t => OP -> UnaryVOp t -> OpExpr t -> OpExpr t
vUnaryOp OP
"some" (t -> Result t
forall t. t -> Result t
Normal (t -> Result t) -> (Values t -> t) -> UnaryVOp t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Values t -> t
forall t. HasValues t => Values t -> t
inject (Values t -> t) -> (Values t -> Values t) -> Values t -> t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t -> Values t
forall t. HasValues t => t -> Values t
some__ (t -> Values t) -> (Values t -> t) -> Values t -> Values t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Values t -> t
forall t. HasValues t => Values t -> t
inject)

none_ :: HasValues t => [OpExpr t] -> OpExpr t
none_ :: [OpExpr t] -> OpExpr t
none_ = OpExpr t -> [OpExpr t] -> OpExpr t
forall t. NullaryExpr t -> [NullaryExpr t] -> NullaryExpr t
nullaryOp OpExpr t
forall t. HasValues t => OpExpr t
none
none :: HasValues t => OpExpr t
none :: OpExpr t
none = OP -> NullaryVOp t -> OpExpr t
forall t. OP -> NullaryVOp t -> OpExpr t
vNullaryOp OP
"none" (t -> NullaryVOp t
forall t. t -> Result t
Normal (t -> NullaryVOp t) -> t -> NullaryVOp t
forall a b. (a -> b) -> a -> b
$ Values t -> t
forall t. HasValues t => Values t -> t
inject (Values t -> t) -> Values t -> t
forall a b. (a -> b) -> a -> b
$ Values t
forall t. Values t
none__)