0
@@ -8,42 +8,32 @@ module Waves
0
include Functor::Method
0
- attr_accessor :target, :pattern, :generator
0
def initialize( options )
0
- @keys = [] ; @target = options[ :target ]
0
- compile( options[ :pattern ] )
0
+ @target = options[ :target ]
0
+ @pattern = options[ :pattern ]
0
- return false unless m = @pattern.match( request.send( target ) )
0
- zip( @keys, m[1..-1] )
0
+ functor( :match, Waves::Request ) { | request | match( @pattern, request.send( @target ) ) }
0
+ functor( :match, Array, String ) { | pattern, path | match( pattern, path.split('/')[1..-1] ) }
0
+ functor( :match, Array, Array ) do | wants, gots |
0
+ r = {}; matches = wants.all? do | want |
0
+ match( r, want, gots.shift )
0
+ r if matches and gots.empty?
0
- functor( :compile, Array ) do | path |
0
- @generator = lambda { |*args| self.instance_eval { generate( path, args ) } }
0
- @pattern = Regexp.new( '^/' + path.map { |component| compile( component ) }.join('/') + '/?$' )
0
+ functor( :match, Hash, String, String ) { | r, want, got | got if want == got }
0
+ functor( :match, Hash, Regexp, String ) { | r, want, got | got if want === got }
0
+ functor( :match, Hash, Symbol, String ) do | r, want, got |
0
+ r[ want.to_s ] = got if match( r, /([\w\_\-\#]+)/, got )
0
- functor( :compile, String ) { |s| Regexp.escape( s ) }
0
- functor( :compile, Regexp ) { |re| s }
0
- functor( :compile, Symbol ) { |sy| @keys << sy.to_s ; '([\w\_\-\#]+)' }
0
- functor( :compile, Hash ) { |h| @keys << h; '([\w\_\-\#]+)?' }
0
- # this is a bit different than Array#zip ...
0
- functor( :zip, Array, Array ) { | keys, vals | keys.inject( {} ) { | h, key | n, m = zip( key, vals ) ; h[ n ] = m ; h } }
0
- functor( :zip, String, Array ) { | key, vals | [ key, vals.shift ] }
0
- functor( :zip, Hash, Array ) { | h, vals | key = h.keys.first ; [ key.to_s, ( vals.shift || h[ key ] ) ] }
0
- functor( :generate, Array, Array ) { | keys, vals | keys.map { |key| generate( key, vals ) }.compact.join('/') }
0
- functor( :generate, :resource, Array ) { | key, vals | resource }
0
- functor( :generate, :resources, Array ) { | key, vals | resources }
0
- functor( :generate, Symbol, Array ) { | key, vals | generate( key, vals.shift ) }
0
- functor( :generate, Symbol, Symbol ) { | key, val | val }
0
- functor( :generate, Regexp, Array ) { | key, vals | nil }
0
- functor( :generate, Hash, Array ) { | h, vals | vals.shift || h.values.first }
0
+ functor( :match, Hash, Hash, String ) do | r, want, got |
0
+ r[ key.to_s ] = match( r, key, got )
0
+ # hashes represent optional values with a default
0
+ functor( :match, Hash, Hash, nil ) { | r, want, got | r[ want.keys.first.to_s ] = want.values.first }
0
+ # everything else is mandatory ...
0
+ functor( :match, Hash, Object, nil ) { | r, want, got | false }
Comments
No one has commented yet.