Rebol Programming/face

USAGE:

edit
EXTRACT series width /index pos /default value /into output 

DESCRIPTION:

edit

Extracts a value from a series at regular intervals.

EXTRACT is a function value.

ARGUMENTS

edit
  • series -- (Type: series)
  • width -- Size of each entry (the skip) (Type: integer)

REFINEMENTS

edit
  • /index -- Extract from an offset position
    • pos -- The position (Type: any)
  • /default -- Use a default value instead of none
    • value -- The value to use (will be called each time if a function) (Type: any)
  • /into -- Insert into a buffer instead (returns position after insert)
    • output -- The buffer series (modified) (Type: series)

(SPECIAL ATTRIBUTES)

edit
  • catch

SOURCE CODE

edit
extract: func [
    {Extracts a value from a series at regular intervals.} 
    [catch] 
    series [series!] 
    width [integer!] "Size of each entry (the skip)" 
    /index "Extract from an offset position" 
    pos "The position" [number! logic! block!] 
    /default "Use a default value instead of none" 
    value {The value to use (will be called each time if a function)} 
    /into {Insert into a buffer instead (returns position after insert)} 
    output [series!] "The buffer series (modified)" 
    /local len val
][
    if zero? width [return any [output make series 0]] 
    len: either positive? width [
        divide length? series width
    ] [
        divide index? series negate width
    ] 
    unless index [pos: 1] 
    either block? pos [
        if empty? pos [return any [output make series 0]] 
        parse pos [some [number! | logic! | set pos skip (
                    throw-error 'script 'expect-set reduce [[number! logic!] type? get/any 'pos]
                )]] 
        unless into [output: make series len * length? pos] 
        if all [not default any-string? output] [value: copy ""] 
        if binary? series [series: as-string series] 
        forskip series width [forall pos [
                if none? set/any 'val pick series pos/1 [set/any 'val value] 
                output: insert/only output get/any 'val
            ]]
    ] [
        unless into [output: make series len] 
        if all [not default any-string? output] [value: copy ""] 
        if binary? series [series: as-string series] 
        forskip series width [
            if none? set/any 'val pick series pos [set/any 'val value] 
            output: insert/only output get/any 'val
        ]
    ] 
    either into [output] [head output]
]