egison-3.6.0: sample/bipartite-graph.egi
;;;
;;;
;;; Bipartite Graph demonstartion
;;;
;;;
;;
;; Matcher definitions
;;
(define $bipartite-graph
(lambda [$a $b]
(multiset (edge a b))))
(define $edge
(lambda [$a $b]
(algebraic-data-matcher
{<edge a b>})))
;;
;; Demonstration code
;;
(define $bipartite-graph-data
{<Edge 1 "a">
<Edge 1 "a">
<Edge 1 "a">
<Edge 1 "a">
<Edge 1 "b">
<Edge 1 "c">
<Edge 2 "a">
<Edge 2 "a">
<Edge 2 "a">
<Edge 2 "a">
<Edge 2 "a">
<Edge 3 "c">
<Edge 4 "a">
<Edge 5 "a">
<Edge 5 "b">
<Edge 5 "c">
<Edge 6 "c">
<Edge 6 "c">
<Edge 6 "c">
})
(test (match-all bipartite-graph-data (bipartite-graph integer string)
[<cons <edge ,1 $str> _> str]))
(test (unique/m integer
(match-all bipartite-graph-data (bipartite-graph integer string)
[<cons <edge $n $str>
<cons <edge ,n ,str>
!<cons <edge ,n !,str> _>>>
n])))
(test (unique/m integer
(match-all bipartite-graph-data (bipartite-graph integer string)
[<cons <edge $n $str>
<cons <edge ,n ,str>
!<cons <edge ,n !,str> _>>>
n])))
(test (unique/m integer
(match-all bipartite-graph-data (bipartite-graph integer string)
[<cons <edge $n ,"a"> _>
n])))
(test (unique/m integer
(match-all bipartite-graph-data (bipartite-graph integer string)
[<cons <edge $n ,"a">
<cons <edge ,n ,"c">
_>>
n])))
;; I found bug on nested not-patterns
;(test (unique/m integer
; (match-all bipartite-graph-data (bipartite-graph integer string)
; [(& <cons <edge $n $str>
; <cons <edge ,n ,str>
; <cons <edge ,n ,str> _>>>
; !<cons <edge $n2 $str2>
; !<cons <edge ,n2 ,str2> _>>)
; n])))
(test (unique/m integer
(match-all bipartite-graph-data (bipartite-graph integer string)
[<cons <edge $n2 $str2>
!<cons <edge ,n2 ,str2> _>>
n2])))