funcons-tools-0.1.0.0: manual/Funcons/Core/Values/Composite/Collections/TuplesBuiltin.hs
{-# LANGUAGE OverloadedStrings #-}
module Funcons.Core.Values.Composite.Collections.TuplesBuiltin where
import Funcons.EDSL
import Funcons.Types
library = libFromList [
("discard-empty-tuples", ValueOp discard_empty_tuples_op)
, ("tuple-index", ValueOp stepTupleIndex)
]
discard_empty_tuples_ = FApp "discard-empty-tuples" . FTuple
discard_empty_tuples_op vs = rewriteTo $ FValue $ safe_tuple_val (filter (/= EmptyTuple) vs)
-- | /tuple-index(_,N)/ selects the /N/th component of a tuple.
-- e.g. /tuple-index((true,"hello",'B'),2)/ = `"hello"
tuple_index_ :: [Funcons] -> Funcons
tuple_index_ = applyFuncon "tuple-index"
stepTupleIndex args@[NonEmptyTuple v1 v2 vs, vn]
| Nat n <- upcastNaturals vn =
let vals = v1:v2:vs
i = fromInteger n
in if i > 0 && i <= length vals
then rewriteTo (FValue (vals !! (i-1)))
else partialOp (tuple_index_ (fvalues args)) "index out of range"
stepTupleIndex args = sortErr (tuple_index_ (fvalues args)) "tuple-index must be applied to a (non-empty) tuple and a natural number"